时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
给定两个日期,计算这两个日期之间有多少个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
- 样例输入
-
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
题目大意我就不说嘞!这题很容易就能读懂。
这题如果直接用for循环跑一边找闰年的话,对于小数据可能回A但是大数据就会TLE
so~这题我们可以直接求出两个时间段之间 闰年的个数(即2月29日的个数)1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6 #define ll long long 7 using namespace std; 8 9 char month[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}; 10 int f(char a[]) // 返回对应的月份 11 { 12 int i; 13 for (i = 0; i < 12; i ++) 14 { 15 if (strcmp(a,month[i])==0) 16 break; 17 } 18 return i+1; 19 } 20 int main () 21 { 22 ll start_year,start_day; 23 ll end_year,end_day; 24 char smonth[20],emonth[20]; 25 int i,t,ff; 26 while (~scanf("%d",&t)) 27 { 28 ff = 1; 29 while (t --){ 30 scanf("%s %lld, %lld",smonth,&start_day,&start_year); 31 scanf("%s %lld, %lld",emonth,&end_day,&end_year); 32 if (f(smonth)==1 || (f(smonth)==2&&start_day<=29)) // 判断给定的两个时间是否包含2月29日 33 start_year --; 34 if (f(emonth)==1 || (f(emonth)==2&&end_day<29)) 35 end_year --; 36 ll sum = 0; // 利用判断闰年的方法求闰年的个数 37 sum = end_year/4 - start_year/4; //能被4整数的 38 sum = sum - (end_year/100 - start_year/100); // 减去 能被100整数的 39 sum += ((end_year/400 - start_year/400)); // 加上 能被400整除的 40 41 printf("Case #%d: %lld ",ff ++,sum); 42 } 43 44 } 45 return 0; 46 }