题目描述

小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。
数组中的元素从左至右如下所示:

5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3

现在他想要从这个数组中寻找一些满足以下条件的子序列:
1. 子序列的长度为 8;
2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且
要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。
yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个不同的 2023 年的日期。
对于相同的日期你只需要统计一次即可。 
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

本题解题思路,这个蓝桥杯说的真的会糊弄人,在这个数组里面找到子序列8个的就行,我一直以为是连续的,最后却发现不是连续的,还是我太菜了。

就是这个题目就是枚举每个数组上数位的情况,把枚举的每个数字分别放在yyyymmdd上的数位就行。最后输出结果就行。

# include <iostream>
# include <set>
using namespace std;
int a[1001];
int main()
{
	set<int> ans;
	for(int i = 0; i < 100; i++)
	{
		cin>>a[i];
	}
	for(int i = 0; i < 100; i++)
	{
		for(int j = i + 1; j < 100; j++)
		{
			for(int k = j + 1; k < 100; k++)
			{
				for(int l = k + 1; l < 100; l++)
				{
					int year = a[i] * 1000 + a[j] * 100 + a[k] * 10 + a[l];
					if(year == 2023)   //以上先循环每个位数来确定下来2023年 
					{
						for(int o = l + 1; o < 100; o++)
						{
							for(int p = o + 1; p < 100; p++)
							{
								for(int q = p + 1; q < 100; q++)
								{
									for(int r = q + 1; r < 100; r++)
									{
										int month = a[o] * 10 + a[p];
										int day = a[q] * 10 + a[r];
										if((month >= 1 && month <= 12) && (day >= 1 && day <= 31))  //以上遍历所有的数组是为了找到符合月份和日期的条件,仍然是按照位数来排序的。 
										{
											int temp = year * 1000 + month * 100 + day;
											ans.insert(temp);  //最后算出来的放在set数组里面,这个set自己会去重 
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	cout<<ans.size();
	return 0;
 } 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐