給出n堆石子,除第一堆石子外,其餘堆的石子數都不能少於前一堆的石子數。現有兩人輪流取石子,每次能拿任意一堆的任意數量的石子,但要保證拿完之後仍知足每堆石子數不能少於前一堆的石子數。若不能再取石子則輸掉比賽,詢問先手是否必勝php
階梯博弈
spa
由於每堆石子數都不能少於前一堆石子數,因此a[i]-a[i-1]>=0code
並且從第i堆中拿x個石子,那麼第i堆與第i-1堆的差-x,第i+1堆與第i堆的差+x,就至關於將石子向後推了一格blog
那麼就轉換爲能將任意一堆的石子向後推,不能再推的人輸掉比賽遊戲
由於階梯博弈還有個性質:至關於奇數階梯玩NIM遊戲,就直接異或,而後判斷就好了get
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[1100]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int ans=0; for(int i=n;i>=1;i-=2) { ans=ans^(a[i]-a[i-1]); } if(ans==0) printf("NIE\n"); else printf("TAK\n"); } return 0; }