HDU_1907_基础博弈nim游戏

John

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4440    Accepted Submission(s):
2541

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

哎呀卧槽。。。

之前看nim游戏的论文,性子太急,看了一半(拿最后一个胜的情况),然后以为自己弄懂了,然后遇到这个题就有点懵逼,再把论文看完,发现之前自己理解得并不是很透彻。

无论拿最后一个胜还是拿最后一个败,都是在争夺S1状态(只有一个充裕堆)。仔细一想,确实是这样,当到达S1状态,玩家可以决定下一个状态,即把下一个状态变为T0或S0

也就是说谁争夺到S1,谁就必胜。

在拿最后一个败的情况中,当所有堆为孤单堆时,需要特殊判断一下,原因容易想到。

博弈这方面,还需多多练习,多多揣摩!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
using namespace std;

int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int res=0,num;
        int flag=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&num);
            if(num>1)
                flag=1;
            res^=num;
        }
        if(flag)
        {
            if(res>0)
                printf("John\n");
            else
                printf("Brother\n");
        }
        else
        {
            if(n%2==0)
                printf("John\n");
            else
                printf("Brother\n");
        }
    }
    return 0;
}
时间: 2024-08-05 07:05:56

HDU_1907_基础博弈nim游戏的相关文章

博弈-Nim游戏

1069 Nim游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后谁能赢得比赛. 例如:3堆石子,每堆1颗.A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子. Input 第1行:一个数N,表示有N堆石子.(1 <= N <= 1000) 第2 - N

BZOJ 1299 [LLH邀请赛]巧克力棒 博弈(NIM游戏)+构造

题意:链接 方法:博弈+构造 解析: 神题没想到咋做,看完wyf大爷说的话才懂 这道题的题意就是有n堆石子,之后你每次操作有两种做法 第一种是在已经建立的nim游戏上进行nim游戏. 第二种是在未被选的堆中选取若干堆加入这个nim游戏中. 所以这怎么做? 我一直尝试去建立一个必败态,不过可能我走的方法过多的考虑了将这道题转变为nim游戏套nim游戏而最终走入死胡同,不会做了. 然而这道题的必败态可以这么建:如果是先手的话,我可以建立出来一个异或和为0的nim游戏,此时后者有两种做法,第一种是在该

$NIM$游戏小总结

$umm$可能之后会写个博弈论总结然后就直接把这个复制粘贴上去就把这个删了 但因为还没学完所以先随便写个$NIM$游戏总结趴$QAQ$ 首先最基础的$NIM$游戏:有$n$堆石子,每次可以从一堆中取若干个,求最后谁胜利 这种有个结论,是说当开局所有数异或起来不为0时先手必胜 证明在这里写了下,懒得再写遍了挺显然的$QwQ$ 然后说下变式昂 变式1:每次取的石子数量有上界$m$ $umm$就是一个$bash\ game$+$NIM\ game$(关于$bash\ game$的话放个最$easy$的

hihoCoder#: 博弈游戏&#183;Nim游戏

[题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏. 在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个石子. 每一次行动,Alice和Bob可以选择从一堆石子中取出任意数量的石子.至少取1颗,至多取出这一堆剩下的所有石

【HDU3032】【Lasker&#39;s Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42652745 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:n堆石子,每次可以从某堆中拿走若干,也可以把此堆分成两个非空堆,谁无法操作了谁输. 题解:首先我们可以打个SG函数来暴力出解,但是显然这会T. 但是不要害怕,我们打完以后发现了一个貌似对的规律: 对于所有的k >= 0,有 sg( 4k+1 ) = 4k+1: sg( 4k+2 ) = 4k+2: sg(

hiho一下 第四十五周 博弈游戏&#183;Nim游戏&#183;二 [ 博弈 ]

传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到正面).翻最后一枚正面向上的硬币的人获胜.同样的,这次游戏里面Alice仍然先手,两人均采

hiho一下 第四十四周 题目1 : 博弈游戏&#183;Nim游戏

题目1 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏. 在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个石子. 每一次行动,Alice和Bob可以选择从一堆石子中取出任意数量的石子.至少取1颗,至多取出这一堆剩下的所有石子. Alice和Bob轮流行动,取走最后一个石子的人获得胜

[博弈]受限Nim游戏

题目大意:有N(1<=N<=100)堆石子,每堆个数给定A1..AN(1<=Ai<=2,147,483,647),现有甲乙两人轮流取石子,由甲开始,每次选一堆,取走一定数目石子,1到Ai的一半取下整,如Ai=5时,可取1或2,Ai=6时,可取1或2或3,但Ai=1不能取.不能取者负,求甲是否获胜.假定每人都采取最优策略. 这是我第一道用sg来做的题目,先贴一个链接,此人对sg的介绍非常好,至少我一遍看懂了,非常感谢.http://blog.163.com/[email protec

hihoCoder - #1173 : 博弈游戏&#183;Nim游戏&#183;三

#1173 : 博弈游戏·Nim游戏·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但并不取走石子.比如说有一堆石子为k个,当Alice或者Bob行动时,可以将这一堆石子分成两堆,分别为x,y.满足x+y=k,x,y>0.那么增加了这一条规则后,在Alice总先手的