P1512 伊甸园日历游戏

这是一个关于日期变换的游戏,玩家Adam和Eve在1900.1.1到2006.11.4之间选取日期,轮流进行加天数或加月份的操作。如果日期变为2006.11.4,玩家获胜。Adam先手,问题在于是否存在必胜策略。关键在于判断当前日期是否可以通过特定操作使得对手无法在下一次操作后达到目标日期。特定条件包括:9月30日和11月30日,以及月份和日期之和为偶数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目描述

Adam和Eve玩一个游戏,他们先从1900.1.1到2006.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,这样的操作是非法的,我们不允许这样做。而且所有的操作均要考虑历法和闰年的规定。

谁先将日期变到2006.11.4谁就赢了。

每次游戏都是Adam先操作,问他有没有必胜策略?

输入格式

一个测试点。多组数据。

第一行为数据组数。

接下来一行X Y Z表示X年Y月Z日

输出格式

输出“YES”or“NO”表示亚当是否有必胜策略。

输入输出样例

输入 #1

3
2001 11 3
2001 11 2
2001 10 3

输出 #1

YES
NO
NO

说明/提示

建议先把所有情况都算出来^_^

思路

2001 11 4必败
2021 10 4,2021 11 3必胜(b+c是偶数)
2021 10 3,2021 10 5,2021 11 2,2021 11 4必胜(b+c是奇数)
以此类推
但9 30和11 30不行,因为9.30和11.30月份+1,即10.30和12.30,都是必败局面

代码

#include<bits/stdc++.h>
using namespace std;
int a,b,c,n,ans=0;
int main(){
	cin>>n;
	while(n--){
		cin>>a>>b>>c;
		if((b==9&&c==30)||(b==1&&c==30)||((b+c)%2==0)) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}
/*
3
2001 11 3
2001 11 2
2001 10 3

YES
NO
NO
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值