(博弈论) 51NOD 1069 Nim游戏

有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 + 1行:N堆石子的数量。(1 <= A[i] <= 10^9)

Output

如果A获胜输出A,如果B获胜输出B。

Input示例

3
1
1
1

Output示例

A解:博弈论的经典模型之一,结论很神奇。(Bouton‘s Theorem)对于一个Nim游戏的局面(a1,a2,...,an),它是B(后操作者)获胜当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。想了快一天了,知其然不知其所以然。用平衡和非平衡解释还是挺好理解的,就是不知道是怎么想到如何定义平衡的。
 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     int n;
 6     while (scanf_s("%d", &n) != EOF)
 7     {
 8         int ans = 0;
 9         while (n--)
10         {
11             int temp;
12             scanf_s("%d", &temp);
13             ans ^= temp;
14         }
15
16         printf("%c\n", ‘B‘ - (ans ? 1 : 0));
17     }
18 }

原文地址:https://www.cnblogs.com/Ekalos-blog/p/9651481.html

时间: 2024-11-06 23:05:50

(博弈论) 51NOD 1069 Nim游戏的相关文章

51Nod 1069 Nim游戏 (位运算)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后谁能赢得比赛. 例如:3堆石子,每堆1颗.A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子. Input 第1行:一个数N,表示有N堆石子.(

51nod 1069 Nim游戏

有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后谁能赢得比赛. 例如:3堆石子,每堆1颗.A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子. 收起 输入 第1行:一个数N,表示有N堆石子.(1 <= N <= 1000) 第2 - N + 1行:N堆石子的数量.(1 <= A[i] <= 10^9) 输出 如果A获胜输出

1069 Nim游戏

1069 Nim游戏 基准时间限制:1 秒 空间限制:131072 KB 有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 + 1行:N堆石子的数量

hdu 1849Rabbit and Grass(博弈论 一维nim游戏)

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3058    Accepted Submission(s): 2261 Problem Description 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生在今年的圣诞节却表现得一点都不浪漫:不去逛商场,不去逛

BZOJ_1022_[SHOI2008]_小约翰的游戏John_(博弈论_反Nim游戏)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1022 反Nim游戏裸题.详见论文<组合游戏略述——浅谈SG游戏的若干拓展及变形>. 分析 1 #include <bits/stdc++.h> 2 using namespace std; 3 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar()

博弈-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

BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一下序,从大到小求. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cmath> 6 #include<algor

[CQOI2013]新Nim游戏(博弈论,线性基)

[CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(又轮到第一个游戏者)开始,规则和Nim游

暑假考试题2:Nim游戏 改(博弈论)

题目: 其实就是在nim游戏基础上添加了一次可以不取的机会. 多堆石子可以看成多个游戏,它们起点的sg值异或起来就是整个游戏的sg值,若sg值为1,则先手必胜,为0,则后手必胜. 关键在于怎么求sg值:可以打表找规律->对游戏局面进行动态dfs连边,再dfs一遍求sg值(也就是求mex值) 细节:dfs能跑到的范围很小,最多到20(可能还达不到,因为边实在是太多了),所以死循环时不要怀疑是自己打错了,还可能是石子数太大了. 规律:石子数为奇数,mex值为a[i]+1,偶数,mex值为a[i]-1