[kuangbin]博弈基础题1:A - Calendar Game :日历游戏

版权声明: https://blog.csdn.net/weixin_39792252/article/details/79114283

寒假练习第一天

A - Calendar Game

题目大意:
日历游戏:这个游戏由1900年1月1日到2001年11月4日的比赛日组成。从这个时间间隔中随机选择一个日期开始。两个人,Adam和 Eve, Adam 第一个移动,然后一次移动。只有一个规则移动: 从当前日期 ,一个人可以移动到第二天或下个月的同一天。当下个月没有相同的日期时,玩家只移动到下一个日历日期。
如果一个人移动到2001年11月4日以后就输了。
写程序判断Adam是不是赢家。

判断润年:①:非整百年数除以4,无余为闰,有余为平;②整百年数除以400,无余为闰有余平。
代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<iomanip>

using namespace std;

int main()
{
    int cse;
    string s;
    scanf("%d",&cse);
    bool ten[32],ele[32];ele[4] = false;ele[3] = true;ele[2] = false;ele[1] = true;
    ten[31] = false;
    for(int i = 30; i >= 1; i--) ten[i] = (!ten[i+1]);
    while(cse--)
    {
            bool f = false;
            int y,m,d;
            scanf("%d%d%d",&y,&m,&d);
            if(y >= 2001&&m >= 11){
                    if(y == 2001&&m == 11&&d <= 4) f = ele[d];
                    else f = false;
            }
            else if((m+d)%2 == 0) f = true;
            else{
                if((m == 11&&d == 30)||(m == 9&&d == 30)) f = true;
            }
            if(f) puts("YES");
            else puts("NO");

    }

具体思路:本来我想打表找规律,然而表实在难打,网上的思路给我很大启发,希望自己的思维能够发散一点,必败状态是11月4日,则每次日期改变都会改变日期的奇偶性,除了两个特殊日期11月30和9月30,则其他日期都会改变;因此特判就好,至于网上有讲用SG函数的,正在研究之中。

展开阅读全文

没有更多推荐了,返回首页