[2014-11-01 模拟赛] 日历游戏

描述 Description

moreD 和 moreD 的宠物 CD 正在玩一个日历游戏,开始时,他们从 1900 年 1 月 1 日到 2012 年 12 月 22 日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:

  1. 跳到日历上的下一天。

  2. 跳到日历上的下个月的同一天(如果不存在,则不能这么做)。

要是谁正好到达 2012 年 12 月 22 日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。

每次都是 moreD 先走的。

现在,给你一个日期,请问 moreD 一定能赢吗?

输入格式 InputFormat

输入共 T 行,每行三个整数,Y、M、D,分别表示年、月、日。日期在 1900 年 1 月 1 日到 2012 年 12 月 22 日之间(包含两端)。
T 并不在输入数据当中。

输出格式 OutputFormat

要是 moreD 一定能赢,输出一行 YES,否则输出 NO。

样例输入 SampleInput

1956 3 26
1985 9 27
2005 2 2
1966 11 28
1951 8 5

样例输出 SampleOutput

NO
YES
YES
NO
NO


NOIP 模拟赛


代码 Code

枚举递推即可。

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int i,j,t,n,m,l,r,k,z,y,x;
bool f[2014][15][33];
int d,ty,tm,td;
inline bool pdnn(int y)
{
    if (y%400==0 || (y%100!=0 && y%4==0)) return true;
    else return false;
}
inline int getd(int y,int m)
{
    if (m==13) return 31;
    if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) return 31;
    if (m==4 || m==6 || m==9 || m==11) return 30;
    if (m==2)
    {
        if (pdnn(y)) return 29;
        else return 28;
    }
}
inline bool nextday(int y,int m,int d)
{
    if (d==getd(y,m))
    {
        d=1;
        if (m==12)
        {
            m=1;y++;
        }
        else m++;
    }
    else d++;
    return f[y][m][d];
}
inline bool nextmonth(int y,int m,int d)
{
    if (m==12)
    {
        m=1;y++;
    }
    else m++;
    return f[y][m][d];
}
int main()
{
    freopen("calendar.in","r",stdin);
    freopen("calendar.out","w",stdout);
    memset(f,false,sizeof(f));
    for (i=1;i<=22;i+=2) f[2012][12][i]=true;
    for (i=23;i<=30;i+=2) f[2012][11][i]=true;
    for (i=2;i<=22;i+=2) f[2012][11][i]=true;
    for (y=2012;y>=1900;y--) for (m=(y==2012)?10:12;m>=1;m--) for (d=getd(y,m);d>=1;d--)
    {
        if (d>getd(y,m+1)) f[y][m][d]=!nextday(y,m,d);
        else f[y][m][d]=!(nextday(y,m,d) & nextmonth(y,m,d));
    }
    while ((scanf("%d%d%d",&y,&m,&d))!=EOF)
    {
        if (f[y][m][d]) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}