poj1704 Georgia and Bob(Nim变形:阶梯博弈)

题目链接

分析:
有不少博弈问题都是Nim游戏的变体:
对于所有可以移动的棋子,考虑两个相邻的棋子
这里写图片描述
先手移动前一个棋子,后手就可以模仿操作移动相等的步数
这样操作后这两个相邻棋子之间的间隔大小是不会有变化的

我们把序列上的所有棋子两两绑定
如果棋子个数是奇数,第一个棋子与位置0配对
两两成组,组与组之间是不会互相影响的

那么单独看一组:
想要消除之间的间隔,唯一的方法就是移动后一个棋子
我们可以把间隔视为Nim游戏中的一堆石子
整个问题就转化成了朴素的Nim游戏了

tip

每一堆石子的个数: a[i]a[i1]1 a [ i ] − a [ i − 1 ] − 1

dada们把这种博弈称为:阶梯博弈
一般的解决方法就是两两抱团(奇数就把第一个单独提出),来做Nim

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N=1005;
int n,a[N];

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        int t=0;
        for (int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        if (n&1)
        {
            t^=(a[1]-1);
            for (int i=3;i<=n;i+=2)
                t=t^(a[i]-a[i-1]-1);
        }
        else
        {
            for (int i=2;i<=n;i+=2)
                t=t^(a[i]-a[i-1]-1);
        }
        if (!t) printf("Bob will win\n");
        else printf("Georgia will win\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值