「CF1382B」Sequential Nim - 題解
阿新 • • 發佈:2020-08-03
-
分析
我們可以發現對於若干堆(第一堆數量大於 \(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; }