2015编程之美资格赛题解 |
|
|
2015编程之美资格赛
1/11
第一题:2月29日
描述
给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。
只有闰年有2月29日,满足以下一个条件的年份为闰年:
1.年份能被4整除但不能被100整除
2.年份能被400整除
输入
第一行为一个整数T,表示数据组数。
之后每组数据包含两行。每一行格式为"monthday,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×10
9
样例输入
4
January12,2012
March19,2012
August12,2899
August12,2901
August12,2000
August12,2005
February29,2004
February29,2012
样例输出
Case#1:1
Case#2:0
Case#3:1
Case#4:3
2015编程之美资格赛
2/11
解析:编程之美第一题一般都是模拟题,主要考察思维清晰度与细节问题。
代码:
#include
#include
#include
usingnamespacestd;
stringmonths[]={"January","February","March","April","May","June","July","August",
"September","October","November","December"};
boolis_leapyear(longlongy){
return((y%4==0&&y%100!=0)||y%400==0);
}
intmain()
{
intT;
cin>>T;
intT1=T;
charm1[20];charm2[20];intm11,m22,d1,d2;longlongy1,y2;
while(T--){
scanf("%s%d,%ld\n%s%d,%ld",&m1,&d1,&y1,&m2,&d2,&y2);
for(inti=0;i<12;i++)
{if(months[i]==m1)m11=(i+1);
if(months[i]==m2)m22=(i+1);}
longlongN=0;
if(y1==y2&&is_leapyear(y1)){
if(m11<=2&&((m22>2)||(m22==2&&d2==29)))
N=1;
}
if(y1 for(longlongj=y1+1;j if(is_leapyear(j))N++;
if(is_leapyear(y1)&&m11<=2)N++;
if(is_leapyear(y2)&&(m22>2||(m22==2&&d2==29)))N++;
}
cout<<"Case#"< }
return0;
}
思路比较清晰:判断year1+1----year2-1之间有多少个闰年,再单独判断两个端点。
问题也比较突出:英语的月份转换,可以用map;更大的问题是在判断中间有多少个闰年的时候有没有必
要逐个去判断。
2015编程之美资格赛
3/11
NO1代码:
#include
#include
#include
#include |
|
|
|
|
|
|
|