HDU1729Stone Game

Problem Description
This game is a two-player game and is played as follows:

1. There are n boxes; each box has its size. The box can hold up to s stones if the size is s.
2. At the beginning of the game, there are some stones in these boxes.
3. The players take turns choosing a box and put a number of stones into the box. The number mustn’t be great than the square of the number of stones before the player adds the stones. For example, the player can add 1 to 9 stones if there are 3 stones in the box. Of course, the total number of stones mustn’t be great than the size of the box.
4.Who can’t add stones any more will loss the game.

Give an Initial state of the game. You are supposed to find whether the first player will win the game if both of the players make the best strategy.
 

Input
The input file contains several test cases.
Each test case begins with an integer N, 0 < N ≤ 50, the number of the boxes.
In the next N line there are two integer si, ci (0 ≤ ci ≤ si ≤ 1,000,000) on each line, as the size of the box is si and there are ci stones in the box.
N = 0 indicates the end of input and should not be processed.
 

Output
For each test case, output the number of the case on the first line, then output “Yes” (without quotes) on the next line if the first player can win the game, otherwise output “No”.
 

Sample Input
3 2 0 3 3 6 2 2 6 3 6 3 0
 

Sample Output
Case 1: Yes Case 2: No

 

題意:你有一些盒子,這些盒子有一個體積si,然後你和另一個人往裏面放石子,盒子裏面本來有一些石子,你和另外一個人輪流放的時候放的最多不能超過裏面的石子的平方(比如裏面原來有3個,那麼你可以放的石子數量是1-9)當然了石子總數量不能超過其體積,最後不能放石子的輸。

分析:找必敗態:
設t,t*t +t < s 而且使 t 儘量的大,則(t+1)*(t+1) +(t+1) >= s,
因此
1. c > t 則當前狀態是必勝態,因爲c*c+c >= s成立
2. c == t 則當前狀態爲必敗態,因爲最多放c*c個石頭,
瓶子未滿,對手必勝,至少放1個石頭,則對手也是必勝。
3. c < t 當前狀態無法確定,而在瓶子中已經有c個石頭的前提下,
容量爲 s 和容量爲 t 的狀態是等價的,如果(t, c)是必敗態,則(s, c)也是必敗態。

#include "stdio.h"
#include "math.h"
int getsg(int s,int c)
{
	int t=sqrt(s);
	while (t*t+t>=s)
		t--;
	if(c>t)
		return s-c;
	else if(c==t)
		return 0;
	else
		return getsg(t,c);
}
int main()
{
	int n,s,c,i,j;
	int kk=0;
	while (scanf("%d",&n)==1&&(n))
	{
		int mark=0;
		while(n--)		
		{
			scanf("%d%d",&s,&c);
			mark^=getsg(s,c);
		}
		if(mark)
			printf("Case %d:\nYes\n",++kk);
		else 
			printf("Case %d:\nNo\n",++kk);
	}
} 



發佈了22 篇原創文章 · 獲贊 1 · 訪問量 7390
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章