有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。
每个点10组数据,每组1000堆,个数小于等于10000。
首先将石子差分,则移走石子变为将石子移到右边一堆。
结论:从最后一堆开始数,只有奇数堆是有用的,其异或和不为0则先手必胜。
这是因为对于每个从偶数堆向奇数堆挪石子的操作,都可以将其再向右移一次,奇数位异或和不变,而石子总数逐渐减少。
#include<cstdio>
using namespace std;
int u,n,a[1001],b;
int sum;
int main()
{
scanf("%d",&u);
while(u--)
{
scanf("%d",&n);
sum=0;
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=n&1?1:2;i<=n;i+=2)
sum^=a[i]-a[i-1];
if(sum) puts("TAK");
else puts("NIE");
}
return 0;
}

本文介绍了一种关于石子游戏的算法解决方案。该方案适用于有N堆石子的游戏,每堆石子数量遵循特定规则。文章详细解释了如何通过差分转换将问题简化,并给出了一个确定先手玩家是否必胜的结论及实现代码。
740

被折叠的 条评论
为什么被折叠?



