1004. 伊甸园日历游戏

描述

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”表示亚当是否有必胜策略。

样例1

样例输入1

3
2001 11 3
2001 11 2
2001 10 3

样例输出1

YES
NO
NO

题解

这道题目可以由必胜态和必败态的思想来解决。
我们可以发现,对于大多数情况,我们不管是增加月数或者是增加日数,都会造成(月数+日数)的奇偶性发生变化。
2011.11.4的(月数+日数)=(11+4)为奇数,所以我们只要保持自己的(月数+日数)为偶数则能致胜。
我们来分析所有的(月数+日数)为偶数的状态,看看有没有可能在某种状态下会发生:(月数+日数)--> (月数+日数)
即:我出之前是偶数状态,出之后还是偶数状态,那么这个时候我就会从必胜态转到必败态了(即让对手进入了必胜态)。
这种情况只可能发生在不能增加月份而只能增加日数,并且增加一天后变到了下个月的1号的时候,那么这种情况有:

 
  1. 1.31 --> 2.1 (偶数状态转为奇数状态)

  2. 2.28 --> 3.1 (不必须,可以2.28 --> 3.28)

  3. 3.31 --> 4.1 (偶数状态转为奇数状态)

  4. 4.30 --> 5.1 (不必须,可以4.30 --> 5.30)

  5. 5.31 --> 6.1 (偶数状态转为奇数状态)

  6. 6.30 --> 7.1 (不必须,可以6.30 --> 7.30)

  7. 7.31 --> 8.1 (偶数状态转为奇数状态)

所以可以发现,如果我的(月数+日数)为偶数,则我毕为必胜态。

然后来分析一下有没有可能让我的状态从必败态转为必胜态。
因为之前分析过:所有的(月数+日数)为偶数的状态都为必胜态,所以如果我的对手处于必胜态了,则我肯定要输了;所以我只能在第一次出的阶段将对手转到必败态。这种情况刚好也对应着当前(月数+日数)为奇数 并且 不能增加月份而只能增加日数,并且增加一天后变到了下个月的1号的时候,我们来分析这些情况:

  1. 2.29 --> 3.1 (奇数状态转为偶数状态,必败态)

  2. 8.31 --> 9.1 (奇数状态转为偶数状态,必败态)

  3. 9.30 --> 10.1 (奇数状态转为奇数状态,可行)

  4. 10.31 --> 11.1 (奇数状态转为偶数状态,必败态)

  5. 11.30 --> 12.1 (奇数状态转为奇数状态,可行)

  6. 12.31 --> 1.1 (奇数状态转为偶数状态,必败态)

所以我们可以发现,9.30和11.30这两天对我来说是必胜态。

综上所述:所有(月数+日数)为偶数的日期和9.30,11.30这两天我是必胜态,其余时间我是必败态。

代码如下:​​​​​​

#include <iostream>
using namespace std;
int T, x, y, z;
int main()
{
    cin >> T;
    while (T--)
    {
        cin >> x >> y >> z;
        if ((y+z)%2 == 0 || (y == 9 || y == 11) && z == 30)
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
    return 0;
}

​​​​​​​

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值