zoukankan      html  css  js  c++  java
  • bzoj 1022: [SHOI2008]小约翰的游戏John

    $ color{#0066ff}{ 题目描述 }$

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

    (color{#0066ff}{输入格式})

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

    (color{#0066ff}{输出格式})

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

    (color{#0066ff}{输入样例})

    2 
    3 
    3 5 1 
    1 
    1
    

    (color{#0066ff}{输出样例})

    John
    Brother
    

    (color{#0066ff}{数据范围与提示})

    none

    (color{#0066ff}{题解})

    Anti-Nim板子,直接上结论

    1.每一堆石子只有一个时 且异或和为0

    2.存在至少一堆石子多于一个时 且异或和不为0

    此时满足上述一个条件 先手必胜

    #include<bits/stdc++.h>
    #define LL long long
    LL in() {
        char ch; LL x = 0, f = 1;
        while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
        for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
        return x * f;
    }
    int main() {
        for(int T = in(); T --> 0;) {
            int n = in(), flag = 0, x, tot = 0;
            for(int i = 1; i <= n; i++) {
                x = in();
                tot ^= x;
                if(x != 1) flag = 1;
            }
            printf(((!flag && !tot) || (flag && tot))? "John
    " : "Brother
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    【BZOJ5137】Standing Out from the Herd(后缀自动机)
    【BZOJ1564】【NOI2009】二叉查找树(动态规划)
    仙人掌&圆方树学习笔记
    【CF487E】Tourists(圆方树)
    【BZOJ2125】最短路(仙人掌,圆方树)
    【BZOJ4818】序列计数(动态规划,生成函数)
    【BZOJ1023】仙人掌图(仙人掌,动态规划)
    【BZOJ4316】小C的独立集(仙人掌,动态规划)
    【BZOJ4316】小C的独立集(动态规划)
    【BZOJ3240】【NOI2013】矩阵游戏(数论)
  • 原文地址:https://www.cnblogs.com/olinr/p/10464398.html
Copyright © 2011-2022 走看看