BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)
Posted forever97‘s blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)相关的知识,希望对你有一定的参考价值。
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1115
【题目大意】
有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。
两人轮流操作每次操作可以从一堆石子中移走任意多石子,
但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。
【题解】
我们定义最后一堆以及下标与其相差为偶数的堆为偶堆石子,其余的为奇堆石子,
我们发现不管奇堆石子做什么操作,只要在偶堆石子中做相应的操作就可以抵消,
因此决定这个游戏胜负的是奇堆石子和后一个偶堆石子之间的差值,
其差值序列等同于NIM游戏,因此求出其sg值即可。
【代码】
#include <cstdio> using namespace std; const int N=1010; int n,a[N],T; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); int sg=0; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=n;i;i--)if(!((n-i)&1))sg^=(a[i]-a[i-1]); puts(sg?"TAK":"NIE"); }return 0; }
以上是关于BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1115: [POI2009]石子游戏Kam -- 博弈论
BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)