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
");
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 }
View Code
原文地址:https://www.cnblogs.com/cton/p/3436664.html