题目描述
小蓝出生在一个艺术与运动并重的家庭中。
妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和团队合作的精神。
为了既满足妈妈的期望,又不辜负爸爸的心意,小蓝决定根据日期的笔画数来安排自己的练习。首先,他会将当天的日期按照 “YYYYMMDD” 的格式转换成一个 8 位数,然后将这 8 位数对应到汉字上,计算这些汉字的总笔画数。如果总笔画数超过 50,他就去练习篮球;如果总笔画数不超过 50,他就去练习书法。
例如,在 2024 年 1 月 1日这天,日期可表示为一个 8 位数字 20240101,其转换为汉字是 “二零二四零一零一” 。日期的总笔画数为 2 + 13 + 2 + 5 + 13 + 1 + 13 + 1 = 50,因此在这天,小蓝会去练习书法。
以下是汉字的笔画数对照表:
|汉字|笔画数|汉字|笔画数|
| 零 | 13 | 五 | 4 |
| 一 | 1 | 六 | 4 |
| 二 | 2 | 七 | 2 |
| 三 | 3 | 八 | 2 |
| 四 | 5 | 九 | 2 |
现在,请你帮助小蓝统计一下,在 2000 年 1 月 1 日到 2024 年 4 月 13 日这段时间内,小蓝有多少天是在练习篮球?
整体思路
遍历 20000101 到 20240413 之间的合法日期,注意闰年的判断。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int days[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int stroke[] = {13, 1, 2, 3, 5, 4, 4, 2, 2, 2};
bool check(int x)
{
int y = x / 10000;
int m = x % 10000 / 100;
int d = x % 100;
if(!m || m > 12 || !d)
{
return false;
}
if(m != 2)
{
if(d > days[m])
{
return false;
}
}
else
{
int leap = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
if(d > 28 + leap)
{
return false;
}
}
return true;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int ans = 0;
for(int i = 20000101; i <= 20240413; i++)
{
if(check(i))
{
int tmp = i, cnt = 0;
while(tmp)
{
cnt += stroke[tmp % 10];
tmp /= 10;
}
if(cnt > 50)
{
ans++;
}
}
}
cout << ans << endl;
return 0;
}