HDU 6112 今夕何夕 (预处理 枚举)
中文题意都看的懂啦~
思路很简单,就是通过前一天推出当天是星期几,直接枚举所有2017-9999年的每一天就好了。ㄟ( ▔, ▔ )ㄏ
代码:
1 #include <cstdio> 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]<d) continue;//由于平闰年2月的天数不一样,判断一下比较保险 45 if(date[i][m][d]==week){ 46 printf("%d\n",i); 47 break; 48 } 49 } 50 } 51 return 0; 52 }