才错了几分钟,好好看了一下,发现自己的限制条件写错了,思路是有的,但是有点混乱,积累经验了
以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 "); 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 ",days+18*365); 31 } 32 return 0; 33 }