试题描述 |
moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期: 1. 跳到日历上的下一天。 2. 跳到日历上的下个月的同一天(如果不存在,则不能这么做)。 要是谁正好到达2012年12月22日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。 每次都是moreD先走的。 现在,给你一个日期,请问moreD一定能赢吗? |
输入格式 |
输入共T行,每行三个整数,Y、M、D,分别表示年、月、日。日期在1900年1月1日到2012年12月22日之间(包含两端)。 T并不在输入数据当中。 |
输出格式 |
要是moreD一定能赢,输出一行YES,否则输出NO。 |
输入示例 |
输入样例1: 2012 12 20 输入样例2: |
输出示例 |
输出样例1: NO 输出样例2: |
注释说明 |
对于50%的数据,是1949年1月1日后的日期。 T <= 5 对于100%的数据,是1900年1月1日后的日期。T <= 10 |
【分析】
和之前有一题完全一样,为了保证做过的模拟题被完整记录下来还是发出来好了(才不是凑篇数)。
传送门:http://www.cnblogs.com/shamman/p/7336677.html
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int t, a, b, c, x, y, z; 5 int f[2015][15][35]; 6 int m[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 7 8 int fun(int a) { 9 return (a%400==0 || (a%4==0 && a%100)); 10 } 11 12 bool check(int x, int y, int z) { 13 if (x>2012) 14 return false; 15 if (x==2012 && y==12 && z>22) 16 return false; 17 return true; 18 } 19 20 void get1(int &x, int &y, int &z) { 21 int maxx=m[y]; 22 if (y==2) 23 maxx+=fun(x); 24 if (z>maxx) 25 y++, z-=maxx; 26 if (y>12) 27 x++, y=1; 28 return; 29 } 30 31 void get2(int &x, int &y, int &z) { 32 if (y>12) 33 x++, y=1; 34 int maxx=m[y]; 35 if (y==2) 36 maxx+=fun(x); 37 if (z>maxx) { 38 x=2013; 39 return; 40 } 41 return; 42 } 43 44 int dfs(int a, int b, int c) { 45 if (a==2012 && b==12 && c==22) 46 return f[a][b][c]=0; 47 if (f[a][b][c]!=-1) 48 return f[a][b][c]; 49 if (!check(a, b, c)) 50 return f[a][b][c]=1; 51 x=a, y=b, z=c; 52 z++; get1(x, y, z); 53 if (!dfs(x, y, z)) 54 return f[a][b][c]=1; 55 x=a, y=b, z=c; 56 y++; get2(x, y, z); 57 if (!dfs(x, y, z)) 58 return f[a][b][c]=1; 59 return f[a][b][c]=0; 60 } 61 62 int main() { 63 memset(f, -1, sizeof(f)); 64 while(cin >> a >> b >> c) { 65 if (!check(a, b, c)) { 66 cout << "NO" << endl; 67 continue; 68 } 69 if (f[a][b][c]==-1) 70 dfs(a, b, c); 71 if (f[a][b][c]==1) 72 cout << "YES" << endl; 73 else 74 cout << "NO" << endl; 75 } 76 }
时间: 2024-12-28 15:30:51