题目链接:http://acm.ocrosoft.com/problem.php?id=1220
题目描述
Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来。然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到1900.1.2 2 : 把月份加1,例如:1900.1.1变到1900.2.1 其中如果天数超过应有天数则日期变更到下个月的第1天。月份超过12则变到下一年的1月。而且进行操作二的时候,如果有这样的日期:1900.1.31,则变成了1900.2.31,这样的操作是非法的,我们不允许这样做。而且所有的操作均要考虑历法和闰年的规定。 谁先将日期变到2001.11.4谁就赢了。 每次游戏都是Adam先操作,问他有没有必胜策略?
输入
一个测试点。多组数据。 第一行为数据组数。 接下来一行X Y Z表示X年Y月Z日
输出
输出“YES”or“NO”表示亚当是否有必胜策略。
样例输入
3
2001 11 3
2001 11 2
2001 10 3
样例输出
YES
NO
NO
提示
建议先把所有情况都算出来^_^
题意:
每步有两种方案:天数+1或月份+1。先到达目标日期者为赢。如果到达2001.11.4之后的人就输了。规律是不看年份,每次操作必定会使日期和月份的和的奇偶性发生变化 。目标11.4(11+4=15)是奇数。 天数或月份+1都会导致其和的奇偶性发生改变。
除了9.30和11.30两天,注意两个特殊的日期 。9月30日(日+1为10.1,月+1为10.30)和11月30日(日+1为12.1,月+1为12.30),奇偶性可能是保持不变的,但是因为足够聪明,所以,是可以通过加月份来避开这一天的,
所以因为目标是奇数,所以加入一开始是偶数或者是这两天则先者赢,否则后者赢。
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
int y,m,d;
cin>>T;
while(T--){
cin>>y>>m>>d;
if((m==9&&d==30)||(m==11&&d==30)||(m+d)%2==0){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}