POJ 3393 Lucky and Good Months by Gregorian Calendar 模拟题
题目:http://poj.org/problem?id=3393
不多说了,简单模拟题,因为粗心写错了两个字母,导致错了N遍,模拟还是一贯的恶心,代码实在不想优化了,写的难看了点。。
1 #include <stdio.h> 2 #include <string.h> 3 4 const int First = 0; 5 const int Last = 1; 6 7 int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 8 int days[10010][13]; 9 int weekday[10010][13][2]; 10 11 int main() 12 { 13 for(int i = 1; i <= 10000; i++) 14 { 15 memcpy(days[i], month, sizeof(month)); 16 if( (i < 1582 && i % 4 == 0) || 17 (i > 1582 && (i % 4 == 0 && i % 100 != 0 || i % 400 == 0))) 18 { 19 days[i][2] = 29; 20 } 21 } 22 days[1700][2] = 29; 23 days[1752][9] -= 11; 24 weekday[1][1][First] = 6; 25 for(int i = 1; i <= 10000; i++) 26 { 27 for(int j = 1; j <= 12; j++) 28 { 29 weekday[i][j][Last] = (weekday[i][j][First] + days[i][j] - 1) % 7; 30 if(j != 12)weekday[i][j+1][First] = (weekday[i][j][Last] + 1) % 7; 31 else weekday[i+1][1][First] = (weekday[i][j][Last] + 1) % 7; 32 } 33 } 34 35 int t, ys, ms, ye, me; 36 scanf("%d", &t); 37 while(t--) 38 { 39 scanf("%d %d %d %d", &ys, &ms, &ye, &me); 40 int good = 0, lucky = 0; 41 while(!(ys >= ye && ms >= me)) 42 { 43 if(weekday[ys][ms][First] == 6 || weekday[ys][ms][First] <= 1) 44 good++; 45 if(weekday[ys][ms][Last] == 0 || weekday[ys][ms][Last] >= 5) 46 lucky++; 47 if(ms++ == 13) 48 { 49 ys++; 50 ms = 1; 51 } 52 } 53 if(weekday[ye][me][First] == 6 || weekday[ye][me][First] <= 1) 54 good++; 55 if(weekday[ye][me][Last] == 0 || weekday[ye][me][Last] >= 5) 56 lucky++; 57 printf("%d %d\n", lucky, good); 58 } 59 return 0; 60 }