HDU 1201 18岁生日
才错了几分钟,好好看了一下,发现自己的限制条件写错了,思路是有的,但是有点混乱,积累经验了
以0岁生日和18岁生日作为起点终点,很清楚看到中间的年份的天数是必须加上的,问题在于多出的一天是有0岁年还是18岁年来决定
画几条线段就可以看见要判断的区间处于那一年了:
1.如果生日在2.29日之前,那么有误差的一年就在于这年,判断该年
2.那么生日在2.29后,则误差不在今年,而是在最后一年。画图就可以将这个关系表达清楚了
3.以前用暴力做。用暴力只会复杂化,而且那时候是超时了。
1 #include <stdio.h> 2 3 bool is_leap(int y){ 4 return ((y%4==0 && y%100!=0) || y%400==0); 5 } 6 7 int main() 8 { 9 int T , y , m ,d; 10 scanf("%d",&T); 11 while(T--) 12 { 13 int days = 0; 14 scanf("%d-%d-%d",&y,&m,&d); 15 if(m==2 && d==29) 16 { 17 printf("-1\n"); 18 continue; 19 } 20 if(m < 3) 21 { 22 for(int i=0;i<18;i++) 23 days += is_leap(y+i)?1:0; 24 } 25 else 26 { 27 for(int i=1;i<=18;i++) 28 days += is_leap(y+i)?1:0; 29 } 30 printf("%d\n",days+18*365); 31 } 32 return 0; 33 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步