Problem E: 蛤玮准备礼物
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 870 Solved: 144
Submit Status Web Board
Description
蛤玮的妹子要过生日了,经过千挑万选,蛤玮决定给妹子买一盒水彩铅笔,然而卖多少个才合适呢.机智的蛤玮决定数一数今天是妹子出生的第多少天,然后就买那么多根铅笔.
给出蛤玮妹子的生日和今天的日期,求蛤玮一共需要买多少.
注意:生日当天算第0天.
Input
T(1<=T<=1000),表示数据组数.
每组数据一行y1,m1,d1,y2,m2,d2,其中y1,m1,d1表示妹子生日的年月日,y2,m2,d2表示蛤玮所在时空的当前天的年月日.
(1900<=y<=1000000, 1<=m<=12, 1<=d<=当月应有天数).输入保证当前天在妹子生日之后.
Output
每组数据输出一行,蛤玮要买多少根铅笔.
Sample Input
21995 10 24 1995 10 251996 1 9 1996 3 7
Sample Output
158
看起来很简单,实现起来可不容易,一看数据大,得用数学方法,却不到讨论的好麻烦,突然想起来用打表的方法求出两个区间和 再相减不就是答案吗,但是最后怎么交都不对,感觉自己思路没错,看看别人的代码发现自己的闰年400年没判断,在求区间有多少闰年时没有把400年的部分加上(画图形来理解);
这次路过的比赛做一下,总结一下还是不够熟练,会的题不能迅速过掉,有思路的题思考太久 失误太多,有必要多打比赛锻炼自己。
AC代码:
#include<cstdio>
typedef long long LL;
LL a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(LL y,LL m)
{
return ((y%4==0&&y%100!=0)||y%400==0)&&m>2;
}
int main()
{
LL T,y1,y2,m1,m2,d1,d2;
scanf("%lld",&T);
while(T--)
{
scanf("%lld %lld %lld %lld %lld %lld",&y1,&m1,&d1,&y2,&m2,&d2);
LL s1=365*(y1-1),s2=365*(y2-1),t1=(y1-1)/4-(y1-1)/100+(y1-1)/400,t2=(y2-1)/4-(y2-1)/100+(y2-1)/400;//容斥定理运用
s1+=t1; s2+=t2; int i=0;
for(i=1;i<m1;++i) s1+=a[i]; s1+=d1;
for(i=1;i<m2;++i) s2+=a[i]; s2+=d2;
if(judge(y1,m1)) s1++;
if(judge(y2,m2)) s2++;
printf("%lld\n",s2-s1);
}
return 0;
}