• Vijos 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.31 --> 2.1    (偶数状态转为奇数状态)
    2.28 --> 3.1    (不必须,可以2.28 --> 3.28)
    3.31 --> 4.1    (偶数状态转为奇数状态)
    4.30 --> 5.1    (不必须,可以4.30 --> 5.30)
    5.31 --> 6.1    (偶数状态转为奇数状态)
    6.30 --> 7.1    (不必须,可以6.30 --> 7.30)
    7.31 --> 8.1    (偶数状态转为奇数状态)
    

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

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

    2.29 --> 3.1    (奇数状态转为偶数状态,必败态)
    8.31 --> 9.1    (奇数状态转为偶数状态,必败态)
    9.30 --> 10.1   (奇数状态转为奇数状态,可行)
    10.31 --> 11.1  (奇数状态转为偶数状态,必败态)
    11.30 --> 12.1  (奇数状态转为奇数状态,可行)
    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;
    }
    
  • 相关阅读:
    python入门1
    查找字段 和查找组件
    DBGRID 拖动滚动条 和 鼠标滚轮的问题
    数据集 过滤时 RecordCount 属性
    查找字段 如何 过滤
    数据集控件 放在 数据模块 上后,如何写事件代码
    取TTable 过滤后的记录数
    判断 Windows操作系统是32位还是64位
    MatchText MatchStr 区别
    EClassNotFound
  • 原文地址:https://www.cnblogs.com/xianyue/p/6939675.html
Copyright © 2020-2023  润新知