1. 程式人生 > >【hdu1846】Brave Game

【hdu1846】Brave Game

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;}
        for
(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; }
View Code

【hdu1846】Brave Game