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

样例输入
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\n",ff ++,sum);
42         }
43 
44     }
45     return 0;
46 }

 

 
posted @ 2017-05-21 04:04  gaoyanliang  阅读(609)  评论(0编辑  收藏  举报