BZOJ 1115: [POI2009]石子游戏Kam
Description
有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。\(n\leqslant 1000,a_i\leqslant 10^5\)
Solution
阶梯博弈。
将序列差分后,从一堆石子减去一个数相当于差分数列中后面的数加上这个数,然后这就是倒着的阶梯博弈了。
Code
/************************************************************** Problem: 1115 User: BeiYu Language: C++ Result: Accepted Time:4 ms Memory:1276 kb ****************************************************************/ #include<cstdio> #include<iostream> using namespace std; inline int in(int x=0,char ch=getchar()){while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;} int t,n,ans,i;int a[1005]; int main(){ t=in();while(t--){ for(n=in(),ans=0,i=1;i<=n;i++) a[i]=in(); for(int i=n;i>=1;i-=2) ans^=(a[i]-a[i-1]); if(ans) puts("TAK");else puts("NIE"); }return 0; }