首页 > 代码库 > hihoCoder 1148 2月29日

hihoCoder 1148 2月29日

时间限制: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

样例输入
4January 12, 2012March 19, 2012August 12, 2899August 12, 2901August 12, 2000August 12, 2005February 29, 2004February 29, 2012
样例输出
Case #1: 1Case #2: 0Case #3: 1Case #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\n",ff ++,sum);42         }43 44     }45     return 0;46 }

 

 

hihoCoder 1148 2月29日