NOIp模拟2 日历游戏


试题描述


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:
2012 12 21


输出示例


输出样例1:
NO

输出样例2:
YES


注释说明


对于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

NOIp模拟2 日历游戏的相关文章

【noip模拟题】日历游戏(博弈论+搜索)

直接搜索即可... 注意不要爆栈..所以我们可以分块搜索... 然后太懒且太弱我就不写了... orz hzwer [问题描述] moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期: 1. 跳到日历上的下一天. 2. 跳到日历上的下个月的同一天(如果不存在,则不能这么做). 要是谁正好到达2012年12月22日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的. 每次

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

Noip 模拟练习9

Noip 模拟练习9 较容易.一次AK. 锻炼计划 Description 身体是革命的本钱, OIers 不要因为紧张的学习和整天在电脑前而忽视了健 康问题.小 x 设计了自己的锻炼计划,但他不知道这个计划是否可行,换句话 说如果计划不当可能会让他的体力超支,所以小 x 请你帮助他. 一天有 1440 分钟,所以小 x 列出的是这一整天第 1 至第 1440 分钟的计划. 小 x 的体力用一个整数来表示,他会按照计划表进行锻炼,同时,每分钟小 x 的体力会自动增加 1.如果某一分钟末小 x 的

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+