【hdu1846】Brave Game
阿新 • • 發佈:2017-06-07
opened code 代碼 一個人 game 16px col class ++
這道題就是noi.openjudge.cn上的取石子問題,之前是用搜索寫的,但今天發現用博弈論的思路來寫會簡單非常非常多!
首先,如果m>=n,那麽第一個人必勝。
那麽如果現在剩下m+1個石子,那麽接下來那個人無論取1到m中任意一個數字的石子數,都無法取完石子並會剩下1-m個石子,這樣的話下一個人一定獲勝。
換句話說,剩下m+1個石子的話接下來要取的人一定輸。
所以若m+1<n<2(m+1),現在這一個人只要取n-(m+1)個石子,他就一定贏。
而當2(m+1)<n<3(m+1)時,這個人只要取(n-2(m+1))個石子,那麽他的對手取後就會出現剛剛的m+1<n<2(m+1)那種情況,他還是必勝。
推廣一下,只要存在一個i,使得 i*(m+1)<n<(i+1)*(m+1)成立,則第一個人必勝;反之,若存在一個i使得i*(m+1)==n,則第二個人必勝。
好了,分析完之後代碼就很簡單了:
#include<cstdio> int main() { int c,n,m; scanf("%d",&c); while(c--) { scanf("%d %d",&n,&m); if(m>=n){printf("first\n");continue;} forView Code(int i=1;;i++) { if(i*(m+1)<n&&(i+1)*(m+1)>n){printf("first\n");break;} else if(i*(m+1)==n){printf("second\n");break;} } } return 0; }
【hdu1846】Brave Game