算法集训队第二场考核赛_A.博弈游戏

原题链接:算法集训队第二场考核赛_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;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grape_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值