HDU 6112 今夕何夕 (预处理 枚举)

中文题意都看的懂啦~

思路很简单,就是通过前一天推出当天是星期几,直接枚举所有2017-9999年的每一天就好了。ㄟ( ▔, ▔ )ㄏ

代码:

 1 #include 
 2 #define deal(a) a==7?1:(a+1)
 3 int date[10000][13][35];
 4 int month[2][13]={
 5         {0,31,28,31,30,31,30,31,31,30,31,30,31},//平年
 6         {0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
 7 };
 8 int Is_ryear(int x){
 9     if(x%400==0)    return 1;
10     if(x%4==0 && x%100!=0)  return 1;
11     return 0;
12 }
13 void init(){
14     date[2016][12][31]=6;
15     for (int i = 2017; i <=9999 ; ++i) {
16         int f=Is_ryear(i);
17         for (int j = 1; j <=12 ; ++j) {
18             for (int k = 1; k <= month[f][j]; ++k) {
19                 if(j==1 && k==1){//新年第一天
20                     date[i][j][k]=deal(date[i-1][12][31]);//宏定义,即判断该天的前一天是否为星期天,是的话该天为星期一,否则加一
21                 }else if(k==1){//除了1月以外的 每个月的第一天
22                     date[i][j][k]=deal(date[i][j-1][month[f][j-1]]);
23                 }else{
24                     date[i][j][k]=deal(date[i][j][k-1]);
25                 }
26             }
27         }
28     }
29 }
30 int main(){
31     int t,y,m,d;
32     char str[20];
33     init();
34     scanf("%d",&t);
35     while(t--){
36         int week;
37         scanf("%s",str);
38         y=(str[0]-'0')*1000+(str[1]-'0')*100+(str[2]-'0')*10+(str[3]-'0');
39         m=(str[5]-'0')*10+(str[6]-'0');
40         d=(str[8]-'0')*10+(str[9]-'0');
41         week=date[y][m][d];
42         for (int i = y+1; i <= 9999 ; ++i) {
43             int f=Is_ryear(i);
44             if(month[f][m]continue;//由于平闰年2月的天数不一样,判断一下比较保险
45             if(date[i][m][d]==week){
46                 printf("%d\n",i);
47                 break;
48             }
49         }
50     }
51     return 0;
52 }

 

你可能感兴趣的:(HDU 6112 今夕何夕 (预处理 枚举))