1. 程式人生 > >hihoCoder 1148 2月29日

hihoCoder 1148 2月29日

pri algorithm int efi return == mit str ++

時間限制: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 }

 

hihoCoder 1148 2月29日