时间限制:
2000ms
单点时限:
1000ms
内存限制:
256MB
-
4 January 12, 2012 March 19, 2012 August 12, 2899 August 12, 2901 August 12, 2000 August 12, 2005 February 29, 2004 February 29, 2012
样例输出
-
Case #1: 1 Case #2: 0 Case #3: 1 Case #4: 3
-
这题本来是不难的,无奈本人愚钝,想了好久才灵光一闪想出来,给出代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cstdlib> #include<cctype> #include<vector> #include<queue> #include<map> #include<set> #include<string> using namespace std; const int N=1e5+10; bool isyear(int x) { if((x%4==0&&x%100!=0)||x%400==0) return 1; return 0; } int main() { int t; cin>>t; char ss[12][12]={"January","February","March","April","May","June","July","August","September","October","November","December"}; for(int kase=1;kase<=t;kase++) { int a,a1,b,b1,c,c1; char s[100],s1[100]; scanf("%s %d, %d",s,&b,&c); scanf("%s %d, %d",s1,&b1,&c1); for(int i=0;i<12;i++) { if(!strcmp(s,ss[i])) a=i+1; if(!strcmp(s1,ss[i])) a1=i+1; } int sum=0; /* if(c==c1&&isyear(c)&&a<=2&&((a1==2&&b1==29)||a1>=3)) sum=1; if(c!=c1&&(c1-c)<=1002) { for(int i=c+1;i<c1;i++) if(isyear(i)) sum++; if(isyear(c)&&a<=2) sum++; if(isyear(c1)&&((a1==2&&b1==29)||a1>=3)) sum++; } if(c!=c1&&(c1-c)>1002) { /* for(int i=c%100+1;i<=100;i++) if(isyear(i)) sum++; for(int i=1;i<c1%100;i++) if(isyear(i)) sum++;*/ int t1=c/4-c/100+c/400; int t2=c1/4-c1/100+c1/400; sum=sum+t2-t1; if(isyear(c)&&a<=2) sum++; if(isyear(c1)&&(a1<=2&&b1!=29)) sum--; printf("Case #%d: %d\n",kase,sum); } /* int k,t; while(cin>>k>>t) { int asum=0,bsum=0; for(int i=k;i<=t;i++) if(isyear(i)) asum++; cout<<asum<<endl; bsum=(t-k-2)/4-(t-k-2)/100+(t-k-2)/400; if(isyear(t)) bsum++; if(isyear(k)) bsum++; if(isyear(t-1)&&t-1>k) bsum++; cout<<bsum<<endl; }*/ return 0; }
描述
给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。
只有闰年有2月29日,满足以下一个条件的年份为闰年:
1. 年份能被4整除但不能被100整除
2. 年份能被400整除
输入
第一行为一个整数T,表示数据组数。
之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。
数据保证给定的日期合法且第一个日期早于或等于第二个日期。
输出
对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。
数据范围
1 ≤ T ≤ 550
小数据:
2000 ≤ year ≤ 3000
大数据:
2000 ≤ year ≤ 2×109