BZOJ1115: [POI2009]石子游戲Kam

【傳送門:BZOJ1115


簡要題意:

  給出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;
}
相關文章
相關標籤/搜索