[蓝桥杯2023初赛] 日期统计
·
题目描述
小蓝现在有一个长度为 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;
}
更多推荐
已为社区贡献1条内容
所有评论(0)