HDU 1079题解

在正式开始之前,我先自言自语几句,这段纯粹是写给以后的自己看的,大家可跳过。这些题解,其实都是好久之前的,是当初ACM算法训练的时候写下的,当时觉得写博客麻烦又浪费时间,但后来,慢慢的发现写博客还是有些用的,最近这段时间又在重新训练算法,正好就整理一下以前的一些比较复杂的题目出来,再学习一遍。

好了,废话不多说,我们来看题目吧。

Problem Description
Adam and Eve enter this year’s ACM International Collegiate Programming Contest. Last night, they played the Calendar Game, in celebration of this contest. This game consists of the dates from January 1, 1900 to November 4, 2001, the contest day. The game starts by randomly choosing a date from this interval. Then, the players, Adam and Eve, make moves in their turn with Adam moving first: Adam, Eve, Adam, Eve, etc. There is only one rule for moves and it is simple: from a current date, a player in his/her turn can move either to the next calendar date or the same day of the next month. When the next month does not have the same day, the player moves only to the next calendar date. For example, from December 19, 1924, you can move either to December 20, 1924, the next calendar date, or January 19, 1925, the same day of the next month. From January 31 2001, however, you can move only to February 1, 2001, because February 31, 2001 is invalid. 
A player wins the game when he/she exactly reaches the date of November 4, 2001. If a player moves to a date after November 4, 2001, he/she looses the game. 
Write a program that decides whether, given an initial date, Adam, the first mover, has a winning strategy. 
For this game, you need to identify leap years, where February has 29 days. In the Gregorian calendar, leap years occur in years exactly divisible by four. So, 1993, 1994, and 1995 are not leap years, while 1992 and 1996 are leap years. Additionally, the years ending with 00 are leap years only if they are divisible by 400. So, 1700, 1800, 1900, 2100, and 2200 are not leap years, while 1600, 2000, and 2400 are leap years.

Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input. Each test case is written in a line and corresponds to an initial date. The three integers in a line, YYYY MM DD, represent the date of the DD-th day of MM-th month in the year of YYYY. Remember that initial dates are randomly chosen from the interval between January 1, 1900 and November 4, 2001. 
 
Output
Print exactly one line for each test case. The line should contain the answer "YES" or "NO" to the question of whether Adam has a winning strategy against Eve. Since we have T test cases, your program should output totally T lines of "YES" or "NO". 

Sample Input
3 
2001 11 3 
2001 11 2 
2001 10 3 

Sample Output
YES 
NO 
NO 

首先,这道题是一道典型的博弈问题。题目大意就是,Adam 和 Eve玩游戏,从给定的初始日期开始,两人轮流移动日期,移动方法为,移动到第二天或下个月的同一天,当下个月没有同一天时,玩家只能移动到第二天。当玩家在恰好到达2001年11月4日的日期赢得了游戏。如果玩家移至2001年11月4日之后的某个日期,则他/她将失败。

解题思路:
这题的每次变化导致的结果就是月或日期改变,要先发获胜,那就意味着要让后手的处于必败状态,即不论后手如何行动,我们都要让自己保持在必胜状态,方法有2种:
一种是保证这一步后达到目标的步骤必然为奇数,但由于考虑博弈因素,这方法不好控制,放弃。
第二种方法就是由于每次移动,都是月份+1或者日期+1,也就是说,他们的和的奇偶性会随之改变,就可以从这个方向入手。闰年因素只有2月29号特殊,即每次只要判断该闰年时1月29,30,31号特殊考虑吧,其他时候按照常处理即可。由规律可知,当月份与日期和为偶数时,一次行动必然使得和变为奇数,当月份与日期和为奇数时,除了9月30号和11月30号外,一次行动必然使得和为偶数, 而9月30号可以移动为10月1号此时仍为奇数,同样的11月30号也可以移动为12月1号。
而题目中显然,当Adam拿到的初始数和为偶数或者9月30号和11月30号时,他的一次移动可以让Eve拿到的永远是奇数,即Eve永远无法获胜。当然,由于9月30号的前一个状态是8月30号或9月29号,是偶数,所以这个数不可以由Adam传给Eve,11月30号页同理,所以,得到结论,只要和为偶数或者为9月30号和11月30号,Adam先手就能获胜。

AC代码如下:

#include<iostream>
using namespace std;

int main()
{
	int Y, M,D,T;
	cin>>T;
	while(T--)
	{
		cin>>Y>>M>>D;
		if((M+D)%2==0||(M==9&&D==30)||(M==11&&D==30))
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值