BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)

Posted 大奕哥&VANE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)相关的知识,希望对你有一定的参考价值。

看到博弈论,大力推一下sg,发现和NIM一样嘛,sg(x)=x,然后发现sg(1)和sg(0)有点怪,然后发现sg带进去不对,发现如果石子全是1的话就不对,然后一脸懵逼,开始质疑sg的正确性,找到了题解发现是sj函数!!果然是我土鳖了,看了一下论文,这个问题是Anti-NIM游戏,是由JZH提出的结论,结论就是按照NIM游戏sg函数(sg[x]=x)推分类讨论一下。

1:如果存在一堆的sg大于1,如果整个游戏的sg不等于0那么先手必胜。

2:如果不存在一堆的sg大于1,如果整个游戏的sg等于0那么先手必胜。

可以证明(其实这种知道结论去证明过程的东西挺无聊的)

1:如果所有的石子数都为1(情况2),那么显然就是奇偶的问题,正确性显然。

2:如果存在石子数大于1的情况。

若sg等于0,则一定有至少两堆石子数量大于1,那么先手做完之后至少有一堆大于1且sg不为0。

若sg不为0。如果有一堆石子数量为1,先手可以操作变成有奇数堆1的情况,先手赢。如果有两堆或者以上的情况,先手只需把sg变成0即可。

依次类推,当sg等于0时先手必败。正确性成立。

—— by VANE

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int ans=0;
        bool f=1;
        while(n--)
        {
            int x;scanf("%d",&x);
            ans=ans^x;
            if(x>1) f=0;
        }
        if((!ans&&f)||(!f&&ans)) puts("John");
        else puts("Brother");
    }
}

 

以上是关于BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)的主要内容,如果未能解决你的问题,请参考以下文章

[Bzoj1022][SHOI2008]小约翰的游戏John(博弈论)

bzoj1022 [SHOI2008]小约翰的游戏John

bzoj 1022: [SHOI2008]小约翰的游戏John

bzoj 1022 [SHOI2008]小约翰的游戏John - anti Nim

bzoj 1022: [SHOI2008]小约翰的游戏John

bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John