P10385 [蓝桥杯 2024 省 A] 艺术与篮球
题目描述
小蓝出生在一个艺术与运动并重的家庭中。
妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运
动的激情和团队合作的精神。
为了既满足妈妈的期望,又不辜负爸爸的心意,小蓝决定根据日期的笔画数来安排自己的练习。首先,他会将当天的日期按照 YYYYMMDD 的格式
转换成一个 位数,然后将这 位数对应到汉字上,计算这些汉字的总笔画数。如果总笔画数超过 ,他就去练习篮球;如果总笔画数不超过 ,他就去练习书法。
例如,在 年 月 日这天,日期可表示为一个 位数字 ,其转换为汉字是“二零二四零一零一”。日期的总笔画数为 ,因此在这天,小蓝会去练习书法。
以下是汉字的笔画数对照表:
| 汉字 | 笔画数 | 汉字 | 笔画数 |
|---|---|---|---|
| 零 | 五 | ||
| 一 | 六 | ||
| 二 | 七 | ||
| 三 | 八 | ||
| 四 | 九 |
现在,请你帮助小蓝统计一下,在 年 月 日到 年 月 日 这段时间内,小蓝有多少天是在练习篮球?
输入格式
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
输出格式
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题目分析
目的:统计起止日期范围内,满足条件的日期个数。
阅读可知是一个计数问题,非常容易联想到枚举的方式。遍历起止日期范围内的每一个日期,判断日期是否满足条件。
该日期需要满足的条件是:日期对应的八位数对应的汉字笔画总数超过50。我们可以提前将数位对应的笔画数进行打表,之后对八位数进行拆位,累加笔画总数。
需要注意的是,并不是所有的八位数都是合法日期,需要提前判断日期的合法性。
- 月份在 。
- 天数在 1 到对应月份上限之间。
代码实现
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 5;
int num[]={13,1,2,3,5,4,4,2,2,2};
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool isleap(int y){//判断闰年
if(y%400==0 || (y%4==0&&y%100!=0)) return 1;
return 0;
}
bool chk(int num){//判断日期是否合法
int y=num/10000;
int m=num/100%100;
int d=num%100;
if(isleap(y)) mon[2]=29;
else mon[2]=28;
if(m<1||m>12) return 0;
if(d<1||d>mon[m]) return 0;
return 1;
}
int count(int x){//统计八位数对应的笔画总数
int sum=0;
while(x){
sum+=num[x%10];
x/=10;
}
return sum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int ans=0;
//枚举起止日期范围内的所有日期
for(int i=20000101;i<=20240413;i++){
//判断日期是否合法且笔画总数>50
if(chk(i)&&count(i)>50){
ans++;
}
}
cout<<ans;
return 0;
}