1. 程式人生 > >【ACM】杭電OJ 2149

【ACM】杭電OJ 2149

Public Sale

【問題描述】

雖然不想,但是現實總歸是現實,Lele始終沒有逃過退學的命運,因為他沒有拿到獎學金。現在等待他的,就是像FarmJohn一樣的農田生涯。

要種田得有田才行,Lele聽說街上正在舉行一場別開生面的拍賣會,拍賣的物品正好就是一塊20畝的田地。於是,Lele帶上他的全部積蓄,衝往拍賣會。

後來發現,整個拍賣會只有Lele和他的死對頭Yueyue。

通過打聽,Lele知道這場拍賣的規則是這樣的:剛開始底價為0,兩個人輪流開始加價,不過每次加價的幅度要在1~N之間,當價格大於或等於田地的成本價 M 時,主辦方就把這塊田地賣給這次叫價的人。

Lele和Yueyue雖然考試不行,但是對拍賣卻十分精通,而且他們兩個人都十分想得到這塊田地。所以他們每次都是選對自己最有利的方式進行加價。

由於Lele字典序比Yueyue靠前,所以每次都是由Lele先開始加價,請問,第一次加價的時候,
Lele要出多少才能保證自己買得到這塊地呢?

【輸入描述】

本題目包含多組測試,請處理到檔案結束(EOF)。每組測試佔一行。
每組測試包含兩個整數M和N(含義見題目描述,0<N,M<1100)

【輸出描述】

對於每組資料,在一行裡按遞增的順序輸出Lele第一次可以加的價。兩個資料之間用空格隔開。
如果Lele在第一次無論如何出價都無法買到這塊土地,就輸出"none"。

【樣例輸入】

4 2

3 2

3 5

【樣例輸出】

1

none

3 4 5


【題解】巴什博弈

可以參考這篇部落格:【ACM】熊孩子的樂趣

如果M和N滿足 M%(N+1)==0那麼先者肯定會輸

如果M%(N+1)!=0,那麼先取出M%(N+1)個,讓後者面對的是(N+1)的倍數個,這樣先者可定勝利。

如果N>=M,那麼先者第一次就可以取得勝利,輸出所有可能情況。

#include <stdio.h>
int main ()
{
	int M,N;
	while(scanf("%d%d",&M,&N)!=EOF)
	{
		if(M%(N+1)==0)
		{
			printf("none\n");
		}
		else
		{
			if(M%(N+1))	printf("%d",M%(N+1));
			if(N>=M)
			{
				for(int i=M+1;i<=N;i++)
				{
					printf(" %d",i);
				}
			}
			printf("\n");
		}
	}
	return 0;
} 

或者

#include <stdio.h>
int main ()
{
	int M,N;
	while(scanf("%d%d",&M,&N)!=EOF)
	{
		if(M%(N+1)==0)
		{
			printf("none\n");
		}
		else
		{
			if(N>=M)
			{
				for(int i=M;i<=N;i++)
				{
					if(i!=N)
					printf("%d ",i);
					else
					printf("%d\n",i);
				}
			}
			else
			{
				printf("%d\n",M%(N+1));
			}
		}
	}
	return 0;
}