hihocoder1148 February 29(区间闰年计数)

hihocoder1148https://hihocoder.com/problemset/problem/1148

因为题目没有给范围,我本来是这么写的。

1 for(int i = 0; i <= 10000; i++){
2     if(i%4==0&&i%100!=0||i%400==0){
3             cnt++;
4     }
5     memo[i] = cnt;
6 }

然后RE了,事实证明长度还是很大的。

本题的关键在于利用计算闰年的方法巧妙地实现类似以上的计数。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<string>
 7 #include<cmath>
 8 #include<vector>
 9 #include<stack>
10 #include<iterator>
11 #include<queue>
12 #include<cctype>
13 #include<map>
14 #define lson l, m, rt<<1
15 #define rson m+1, r, rt<<1|1
16 #define IO ios::sync_with_stdio(false);cin.tie(0);
17 #define INF 0x3f3f3f3f
18 #define MAXN 100010
19 const int MOD=1e9+7;
20 typedef long long ll;
21 using namespace std;
22 int n, d1, d2, yy1, y2;
23 char s1[110], s2[110];
24 map<string, int> mp;
25 int main()
26 {
27     cin >> n;
28     int kase=0, cnt=0;
29     mp["January"]=1;mp["February"]=2;mp["March"]=3;
30     mp["April"]=4;mp["May"]=5;mp["June"]=6;
31     mp["July"]=7;mp["August"]=8;mp["September"]=9;
32     mp["October"]=10;mp["November"]=11;mp["December"]=12;
33     for(int i = 0; i < n; i++){
34         cnt=0;
35         scanf("%s %d, %d", s1, &d1, &yy1);
36         scanf("%s %d, %d", s2, &d2, &y2);
37         if(yy1 != y2){
38             //容斥的感觉
39             int k1 = yy1/4-yy1/100+yy1/400;
40             int k2 = (y2-1)/4-(y2-1)/100+(y2-1)/400;
41             cnt=k2-k1; 
42            
43             if(yy1%4==0&&yy1%100!=0||yy1%400==0){
44                 if(mp[s1] <= 2){
45                     cnt++;
46                 }
47             }
48             if(y2%4==0&&y2%100!=0||y2%400==0){
49                 if(mp[s2] > 2||mp[s2]==2&&d2==29){
50                     cnt++;
51                 }
52             }  
53         }  
54         else{
55             if(yy1%4==0&&yy1%100!=0||yy1%400==0){
56                 if((mp[s1] <= 2)&&(mp[s2]>2||mp[s2]==2&&d2==29))
57                     cnt++;
58             }
59         }
60         cout << "Case #" << ++kase << ": ";
61         cout << cnt << endl;
62     }
63     return 0;
64 }

 

posted @ 2018-03-30 21:22  Surprisez  阅读(282)  评论(0编辑  收藏  举报