【题解】[蓝桥杯 2024 省 A] 艺术与篮球

64 阅读3分钟

P10385 [蓝桥杯 2024 省 A] 艺术与篮球

题目描述

小蓝出生在一个艺术与运动并重的家庭中。
妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运 动的激情和团队合作的精神。
为了既满足妈妈的期望,又不辜负爸爸的心意,小蓝决定根据日期的笔画数来安排自己的练习。首先,他会将当天的日期按照 YYYYMMDD 的格式 转换成一个 88 位数,然后将这 88 位数对应到汉字上,计算这些汉字的总笔画数。如果总笔画数超过 5050,他就去练习篮球;如果总笔画数不超过 5050,他就去练习书法。
例如,在 202420241111 日这天,日期可表示为一个 88 位数字 2024010120240101,其转换为汉字是“二零二四零一零一”。日期的总笔画数为 2+13+2+5+13+1+13+1=502 + 13 + 2 + 5 + 13 + 1 + 13 + 1 = 50,因此在这天,小蓝会去练习书法。
以下是汉字的笔画数对照表:

汉字笔画数汉字笔画数
1313 44
1144
2222
3322
5522

现在,请你帮助小蓝统计一下,在 200020001111 日到 20242024441313 日 这段时间内,小蓝有多少天是在练习篮球?

输入格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

输出格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

题目分析

目的:统计起止日期范围内,满足条件的日期个数。

阅读可知是一个计数问题,非常容易联想到枚举的方式。遍历起止日期范围内的每一个日期,判断日期是否满足条件。

该日期需要满足的条件是:日期对应的八位数对应的汉字笔画总数超过50。我们可以提前将数位对应的笔画数进行打表,之后对八位数进行拆位,累加笔画总数。

需要注意的是,并不是所有的八位数都是合法日期,需要提前判断日期的合法性。

  • 月份在 1121\sim 12
  • 天数在 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;
}