洛谷 P4279 [SHOI2008]小约翰的游戏

小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有(n)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输。

小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下谁将获得游戏的胜利。

简明题意就是Nim游戏取到最后一个石子的人输

这个题是Anti-Nim

我们先讨论最简单的胜负

1:只有一堆石子且个数为(1),则后手胜

2:每一堆石子都是(1),那么奇数个石子后手胜,偶数个石子先手胜

3:只有一堆石子不是(1),其余每堆石子都是(1),那么先手一定可以选择取(n-1)(n)个来转移到2且为奇数的情况,所以先手胜

4:正常情况,先手只要保证能通过选石子选到3就必胜,也就是自己选到最后一堆石子,那么就是Nim游戏了

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int T,n,ans,sm;
int main()
{
    scanf("%d",&T);
    int x;
    while (T--)
    {
        ans = 0;
        sm = 0;
        scanf("%d",&n);
        for (int i = 1;i <= n;i++)
            scanf("%d",&x),ans ^= x,sm += x;
        if (sm == n)
        {
            if (sm % 2 == 1)
                printf("Brother
");
            else
                printf("John
");
        }
        else
        if (ans)
            printf("John
");
        else
            printf("Brother
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sdlang/p/13625326.html