专栏首页数据结构与算法BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

Description

  小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一 粒石子的人算输。小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明 多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下 谁将获得游戏的胜利。

Input

  本题的输入由多组数据组成第一行包括一个整数T,表示输入总共有T组数据(T≤500)。每组数据的第一行包 括一个整数N(N≤50),表示共有N堆石子,接下来有N个不超过5000的整数,分别表示每堆石子的数目。

Output

  每组数据的输出占一行,每行输出一个单词。如果约翰能赢得比赛,则输出“John”,否则输出“Brother” ,请注意单词的大小写。

Sample Input

2 3 3 5 1 1 1

Sample Output

John Brother

HINT

裸的Anti-Nim游戏

直接上定理

先手必胜的条件

所有堆的石子数都为1且游戏的SG值为0

有些堆的石子数大于1且游戏的SG值不为0

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6+10,INF=1e9+10;
inline char nc()
{
    static char buf[MAXN],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    char c=nc();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
    return x*f;
}
int a[MAXN];
main()
{
    #ifdef WIN32 
    freopen("a.in","r",stdin);
    #else
    #endif
    int QWQ=read();
    while(QWQ--)
    {
        int N=read(),one=0,allone=1,ans=0;
        for(int i=1;i<=N;i++)
        {
            a[i]=read();
            if(a[i]!=1) allone=0;
            if(a[i]>1)  one=1;
            ans=ans^a[i];
        }
        if( (ans==0&&allone) || (ans!=0&&one) ) printf("John\n");
        else    printf("Brother\n");
        
    }
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • cf375D. Tree and Queries(莫队)

    具体实现的时候可以直接用\(tim[i]\)表示第\(i\)个颜色的出现次数,\(ans[i]\)表示出现次数多于\(i\)的颜色的种类

    attack
  • 06:笨小猴

    06:笨小猴 总时间限制:1000ms内存限制:65536kB描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用...

    attack
  • 1215 迷宫

    1215 迷宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在N*N的迷宫...

    attack
  • byte&0XFF的基础

    我们在做二进制转16进制的时候,需要的是数据的正确性而不是数值的正确性。所以我们进行 0XFF 的时候抹掉了高24位,确保了数据二进制补码的完整新(同时也解释了...

    静默加载
  • C++ 函数重载

    C++允许用同一个函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。这就是函数重载。

    chaibubble
  • codeforces 902B(dfs)

    给你一棵树,要求给树染色,给树的一个父结点染色时,该父结点的所有子结点也会被染成同样的颜色,给你颜色列表,求将树染成该列表所用的最小的次数

    dejavu1zz
  • Poj 1564 || HDU 1258 Sum It Up(dfs+技巧)

          题意就是先输入n,m,然后输入m个数,问在这m个数里有多少种任意相加起来等于n的方法,并且输出这些相加的数。

    Ch_Zaqdt
  • P2820 局域网

    题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回...

    attack
  • 南京网络预选赛 The Preliminary Contest for ICPC Asia Nanjing 2019 F 主席树 或 滑动窗口

    查询区间 [ id-k,id+k] 小于 val 的个数 num , 再在该区间查询第 num 大的数。

    用户2965768
  • Day5下午解题报告1

    预计分数:100+60+30=190 实际分数:100+60+30=190 终于有一道无脑T1了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...

    attack

扫码关注云+社区

领取腾讯云代金券