BZOJ1115: [POI2009]石子游戏Kam 博弈论

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

有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值