记录编号 326923 评测结果 TTTTTTTTTT
题目名称 零食店 最终得分 0
用户昵称 GravatarHzoi_Yniverse 是否通过 未通过
代码语言 C++ 运行时间 10.035 s
提交时间 2016-10-21 17:31:59 内存使用 14.23 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int f[2022][22][41],vis[2022][22][41];
bool Run(int x){
	if(x%4) return 0;
	if(x%100==0&&x%400) return 0;
	if(x%3200==0) return 0;
	return 1;
}
bool Day31(int y){
	return (y==1||y==3||y==5||y==7||y==8||y==10||y==12);
}
bool JudgeYear(int y){//跳一个月是否在当年
	return y+1<=12;
}
bool JudgeMonth(int x,int y,int z){//跳一天是否在当月
	if(y==2) return (Run(x)&&z+1<=29)||(!Run(x)&&z+1<=28);
	else return (Day31(y)&&z+1<=31)||(!Day31(x)&&z+1<=30);
}

bool Dp(int x,int y,int z){//1从这一天开始必赢 0从这一天开始必输
	if(vis[x][y][z]) return f[x][y][z];
	vis[x][y][z]=1;
	if(JudgeYear(y)){
		if(y+1!=2) f[x][y][z]|=!Dp(x,y+1,z);//下一个月不是二月
		else if((z==29&&Run(x))||z<29) f[x][y][z]|=!Dp(x,y+1,z);//下一个月是二月
	}
	else if(x+1<=2012) f[x][y][z]|=!Dp(x+1,1,z);//下一年
	if(JudgeMonth(x,y,z)) f[x][y][z]|=!Dp(x,y,z+1);
	else{
		if(JudgeYear(y)) f[x][y][z]|=!Dp(x,y+1,1);
		else if(x+1<=2012) f[x][y][z]|=!Dp(x+1,1,1);
	} 
	return f[x][y][z];
}
int main(){
	//freopen("calendar1.in","r",stdin);
	int x,y,z;
	vis[2012][12][22]=1; f[2012][12][22]=0;
	while(scanf("%d%d%d",&x,&y,&z)!=EOF){
		if(Dp(x,y,z)) printf("未开票\n");
		else printf("NO\n");	
	}
	while(1);
	return 0;
}