zoukankan      html  css  js  c++  java
  • hdu 1907 John (anti—Nim)

    John

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    http://acm.hdu.edu.cn/showproblem.php?pid=1907

    Problem Description
    Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that each player has to eat at least one M&M during his turn. If John (or his brother) will eat the last M&M from the box he will be considered as a looser and he will have to buy a new candy box.

    Both of players are using optimal game strategy. John starts first always. You will be given information about M&Ms and your task is to determine a winner of such a beautiful game.
     
    Input
    The first line of input will contain a single integer T – the number of test cases. Next T pairs of lines will describe tests in a following format. The first line of each test will contain an integer N – the amount of different M&M colors in a box. Next line will contain N integers Ai, separated by spaces – amount of M&Ms of i-th color.

    Constraints:
    1 <= T <= 474,
    1 <= N <= 47,
    1 <= Ai <= 4747
     
    Output
    Output T lines each of them containing information about game winner. Print “John” if John will win the game or “Brother” in other case.

    Sample Input
    2 3 3 5 1 1 1
     
    Sample Output
    John
    Brother
     
    题意:Nim取石子,取到最后一个的输
    若局面异或和为不为0,定义其为S态,否则,定义其为T态
    若一堆石子只有1个,定义其为孤独堆,否则,定义其为充裕堆
     
    S0:无充裕堆,异或和不为0
    S1:有1个充裕堆,异或和不为0
    S2:有>=2个充裕堆,异或和不为0
    T0:无充裕堆,异或和为0
    T1不存在
    T2:有>=2个充裕堆,异或和为0
     
    S0:一定是有奇数个孤独堆,所以必败
    T0:一定是有偶数个孤独堆,必胜
    S1:若孤独堆个数为奇数,则拿空充裕堆,那么留给对方的是S0态,所以S1必胜
    S2:可以转到S1、T2
    T2:可以转到S1、S2
    若T2转到了S2,则S2有转回了T2
    若T2转到了S1,则T2必败
    所以S2必胜
     
    #include<cstdio>
    using namespace std;
    int main()
    {
        int T,n,x,sum,yh;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            sum=yh=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&x);
                yh^=x;
                if(x>1) sum++;
            }
            if(yh&&!sum) printf("Brother
    ");
            else if(!yh&&sum>=2) printf("Brother
    "); 
            else printf("John
    ");
        }
    }
     
  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6744825.html
Copyright © 2011-2022 走看看