HDOJ1079&POJ1082&ZOJ1024 Calendar Game [找规律博弈]
根据奇偶性的变化找到规律,特殊情况特殊考虑
题目大意是:
两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month..........
而且如果下一个月没有当前day的话, 你就不能移动month,比如1月31日,你只能移动day 使其到2月1日,而不能移动月让其到达2月31日,原因你懂的!
嗯,现在Adam开始YY了要!需要你来找一个必胜策略!(到达2001.11.4日就不能移动,无法移动的孩纸败)。
分析:
找规律,不然是月份加一,还是日期加一,都改变了奇偶性,只有两个特殊日期9月30日,和11月30日例外。
那么目标日期是11月4日,为奇数。初始日期如果为偶数的话,先者必胜。
注意: a -> b, 如果b全部是必胜态, 则a是必败态, 如果存在一个b是必败态,则a是必胜态。
必败 必胜
11.4 11.3
11.2 11.1
10.31 10.30
…………
10.5 10.4
…………
10.1 9.30*******(聪明的人 会选择转移到 10月1日)
9.29(聪明的人可以跳到10.29)
…………
9.2 9.1
8.31 8.30
………………
12.1 11.30*****(聪明的人 会选择转移到12月1日)
…………
…………
…………
可以大致看到其实胜负和年份是没有关系的说,年份影响的只是2月是否存在第29天……而29是必败点,28为必胜……
看上图……貌似必胜点 月份+日期 == 偶数 (除去两个例外)
特殊考虑那两个家伙……
代码如下:
int main(){ int yy,mm,dd; int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&yy,&mm,&dd); if( ((mm + dd) & 1) ==0 ) puts("YES"); else if(dd==30 && ( mm == 9 || mm == 11)) puts("YES"); else puts("NO"); } return 0; }