原题链接:算法集训队第二场考核赛_A.博弈游戏
A.博弈游戏
题目描述
A l i c e Alice Alice 和 B o b Bob Bob 在玩博弈游戏,游戏规则如下:
首先,两人先从 1900.1.1 1900.1.1 1900.1.1 到 2001.11.4 2001.11.4 2001.11.4 中随意抽一个日期,然后两人轮流进行操作:
操作 1 1 1 : 把日期的天数加 1 1 1,例如 1999.4.5 1999.4.5 1999.4.5 变到 1999.4.6 1999.4.6 1999.4.6
操作 2 2 2 : 把月份加 1 1 1 ,例如: 1911.3.1 1911.3.1 1911.3.1 变到 1911.4.1 1911.4.1 1911.4.1
A l i c e Alice Alice 和 B o b Bob Bob 谁先将日期变到 2006.11.4 2006.11.4 2006.11.4 谁就赢了。
日期应是合法的。例如,进行操作 2 2 2 的时候,若出现: 1988.1.31 1988.1.31 1988.1.31,则变成了 1988.2.31 1988.2.31 1988.2.31,这样的操作是非法的,我们不允许这样做。
每次游戏都是 A l i c e Alice Alice 先操作,问她有没有必胜策略?输入描述
第一行为数据组数;
接下来一行表示抽中的起始日期为几年几月几日。输出描述
输出 Y E S YES YES 或 N O NO NO,表示 A l i c e Alice Alice 是否有必胜策略。
输入输出样例
输入 #1:
3 2001 11 3 2001 11 2 2001 10 3
输出 #1:
YES NO NO
说明/提示:
【友情提示】
或许没那么难~
解决办法:
本题为本场压轴,是一道比较难想的博弈论,题目改编自洛谷:P1512 伊甸园日历游戏
这种问题只有两种情况:输出 Y e s Yes Yes 或 N o No No,即 A l i c e Alice Alice 和 B o b Bob Bob 中必有一人为必胜态。我们把这种当双方发挥最佳、且存在必胜态的问题叫博弈论。一种解决这个问题的方法就是暴力枚举,打表找规律。
引用洛谷用户 regime 同学的题解:
我们设 $2001.11.4必败,推上去,即2001.10.4和2001.11.3必胜(此时m+d=偶数)再推上去是11.2,10.3,9.3,都是必败(此时m+d=奇数),以此类推……
为什么9.30和11.30例外呢?因为9.30和11.30月份+1,即10.30和12.30,都是必败局面。这种情况只有在8月与以后出现,为什么大家应该清楚。2.29为奇数,必败。没有2.29,剩2.28和3.1衔接也没问题,都是必胜。12.31必败,1.1必胜(以上情况自己考虑,其实就是枚举打表找规律的思维)
所以本题和年份完全没关系。
参考代码:
#include<iostream>
#define py printf("YES\n")
#define pn printf("NO\n")
using namespace std;
int a,b,c,n,stop=0;
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
if((b==9&&c==30)||(b==1&&c==30)||((b+c)%2==0))py;
else pn;
}
return 0;
}