第 1 题:特殊日期
思路:直接统计一整年中月和日每一个值的取值次数,然后对年进行判断年的每一位的和加起来是否存在以及在月和日的和中出现多少次(注意要特判闰年,也即是特判是否为f[2+29],是的话结果++)
#include<bits/stdc++.h>
using namespace std;
int month[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int f[100];
int cnt;
int solve(int n) {
int ans=0;
while(n) {
ans+=n%10;
n/=10;
}
return ans;
}
void init() {
for(int i=1; i<=12; i++) {
for(int j=1; j<=month[i]; j++) {
int t=i%10+i/10;
int tt=j%10+j/10;
f[t+tt]++;
}
}
}
int main() {
init();
for(int i=1900; i<9999; i++) {
if(i%400==0||i%4==0&&i%100!=0)
{
int t=solve(i);
cnt+=f[t];
if(t==13)cnt++;
}
else
{
int t=solve(i);
cnt+=f[t];
}
}
cout<<cnt<<endl;
}
第 2 题:重合次数
#include <iostream>
using namespace std;
int main()
{
// 秒针每秒走360/60=6度
// 分针每秒走6/60=0.1度
// 设x秒后重合,则:
// 0.1x+360=6x
// 5.9x=360
// x=360/5.9≈61
// 秒针和分针每隔61秒重合一次
int times = 14*3600+36*60+20-6*3600-13*60-22;
cout << times / 61;
}