1. 程式人生 > 實用技巧 >「CF1382B」Sequential Nim - 題解

「CF1382B」Sequential Nim - 題解

  • 分析

    我們可以發現對於若干堆(第一堆數量大於 \(1\),有這麼一個貪心的取法:

    比如第一堆堆數量為 \(n(n>1)\)先手先取 \(n-1\) 個。這樣後手只能取 \(1\) 個(無法不取)。

    這樣,先手就可以先取第二堆

    後幾堆的取法同上,直到先手可以先取最後一堆。

    對於最後一堆,先手直接取完。獲勝。

    那如果中間有一堆數量為 \(1\) 那麼對於這一堆的前一堆,直接全部取完,後手只能取完這堆數量為 \(1\) 的堆。照樣可以獲得下一堆的先手

    以此類推。我們可以發現,影響最後結果的,只有字首 \(1\) 的數量。

    容易發現,如果字首 \(1\) 數量為偶數個,在輪流取完後,那麼第一個非 \(1\)

    堆,是先手先取。即先手會勝利。

    如果是奇數個,那麼第一個非 \(1\) 堆,是後手先取。即後手會勝利。

    特殊的,如果這堆只有 \(1\)那麼偶數個勝利的為後手奇數個勝利的為先手


  • 程式碼

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int Maxn=1e5+5;
    int T,n,a[Maxn];
    int main()
    {	
        scanf("%d",&T);
        while(T--)
        {	
            int cnt=0,i;
            scanf("%d",&n);
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(i=1;i<=n;i++)
                if(a[i]==1)cnt++;
                else break;
            if(i==n+1)
            {	
                if(cnt%2==0)printf("Second\n");
                else printf("First\n");
            }
            else{
                if(cnt%2==0)printf("First\n");
                else printf("Second\n");
            }
        }
        return 0;
    }