P2197 【模板】nim 游戏(转自洛谷)

题目描述

甲,乙两个人玩 nim 取石子游戏。

nim 游戏的规则是这样的:地上有 n 堆石子(每堆石子数量小于 10^4),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n 堆石子的数量,他想知道是否存在先手必胜的策略。

输入格式

本题有多组测试数据。

第一行一个整数 T (T≤10),表示有 T 组数据

接下来每两行是一组数据,第一行一个整数 n,表示有 n 堆石子,n≤10^4。

第二行有 n 个数,表示每一堆石子的数量。

输出格式

共 T 行,每行表示如果对于这组数据存在先手必胜策略则输出 `Yes`,否则输出 `No`。

样例输入 #1
2
2
1 1
2
1 0

样例输出 #1
No
Yes


题目思路:

必胜策略,即当你执行最后一步后,你的对手已无石子可取,他必败你必胜。最后局面是地上各个石子堆已无石子可取,假设 ai 代表第 i 个石子堆中的石子数,则 ai = 0(i ≤ n)。即可得,a1^a2^a3^……^an=0(^表示异或),令ans = a1^a2^a3^……^an,要想必胜,说明最后的局面一定是ans==0,那我只需要满足,我每次操作完使得ans==0即可,那么每次留给对手的局面都是ans==0(怎么实现后面讲),并且石子的初始数确定,每次都取走一部分的石子,在有限的步数内肯定会取完,当执行到最后一步ans==0时,恰好最后的石子被你取完,你必胜。

那么,判断是否存在先手必胜策略这一问题,即可一开始检验石子堆中的ans是否为0,当ans为0时,你面对的是ans==0的局面,你的任意操作都会使得当前ans不为0,你的对手又足够聪明,那你每执行一步,他都会再次把ans==0的局面返还给你,那你最后必输;当ans不为0时,你先手,你又足够聪明,你每次执行后都可以把ans==0的局面留给对手,最后你必胜。

小tip:

为什么每次操作之后都会使得ans==0转化成ans != 0,并且足够聪明的你执行完一次操作之后又能把ans != 0变成ans==0?

1、ans==0执行一次操作之后为什么会转化为ans != 0?

异或,即是把每个ai中转化为二进制的形式,再对每一个位置的所有0和1进行异或操作,举个例子:5^3=6(0101^0011=0110)。而ans = a1^a2^a3^……^an,每次只能对一个石子堆操作,即每次操作只会影响ai(i ≤ n)中的一个,假设是对ak进行操作,则(没操作前的ak)^(其它ai的异或)==0,说明(其它ai的异或)==(没操作前的ak)(因为两个相同的数相异或结果才为0),现在对ak进行操作,则ak的值肯定会变化,其二进制形式也随之变化,则(操作后的ak)!=(其它ai的异或),所以(操作后的ak)^(其它ai的异或)!= 0,则ans != 0。

2、为什么足够聪明的你执行完一次操作之后又能把ans != 0变成ans==0?

ans = a1^a2^a3^……^an,是各个位置多个0和1的异或,因为ans != 0,说明一定有个别位置中1的个数为奇数,则我们可以把该位置上的1去掉一个或增加一个,即取走一些石头,使之为偶数,则ans==0。例如:10^5=15(1010^0101=1111),这是最经典的了,我们可以从10中拿走5,则5^5=0,所以想说明的是,总有办法使ans==0。


AC代码:

#include <iostream>
using namespace std;
int main()
{int t=0;scanf("%d", &t);int n=0;string str[11];for(int i=1; i<=t; i++){scanf("%d", &n);int ans=0, temp=0;for(int j=1; j<=n; j++){scanf("%d", &temp);ans=ans^temp;}if(ans==0)str[i]="No";else str[i]="Yes";} for(int i=1; i<t; i++){cout<<str[i]<<endl;}cout<<str[t];return 0;
}

希望能帮助到大家!

博弈论石子游戏——nim 游戏相关推荐

  1. 【acm 博弈论 】 之 Nim游戏与sg函数

    文章目录 前言 巴什博弈 威佐夫博弈 Nim游戏 Nim游戏与sg函数 题目 题意 样例 思路 代码 前言 从今天开始复习和整理下acm的部分模块,从博弈论开始. 著名的"取石子" ...

  2. #1163 : 博弈游戏·Nim游戏(数学博弈)

    #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样 ...

  3. hihoCoder#: 博弈游戏·Nim游戏

    [题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,A ...

  4. 博弈游戏·Nim游戏·二

    题目1 : 博弈游戏·Nim游戏·二 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏: N枚硬币排成一列,有的正面 ...

  5. 算法 博弈论( 初级Nim游戏)

    初级Nim游戏 给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败. 问如果两人都采用最优策略,先手是否必胜. 输入格 ...

  6. 组合游戏(分石子,nim游戏,sg)

    一.最近在学习组合游戏方面的知识,我们可以考虑这类组合游戏: (1)两个人轮流操作 (2)游戏状态有限,总能走到最终状态,且都不会出现以前的状态.即给定初始状态,游戏的胜负是可以预见的. (3)规定谁 ...

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

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1022 反Nim游戏裸题.详见论文<组合游戏略述--浅谈SG游戏的若干拓展及变形>. ...

  8. hihocoder #1163 : 博弈游戏·Nim游戏

    题意:有k堆石子,每次选择一堆,在这堆中取至少一个石子,第一个无石子可取的人为输. 思路:经典游戏,直接有结论:如果这些堆的石子数为:a1,a2,a3-an.那么a1到an的异或为0,则先手有必败策略 ...

  9. 博弈论(Nim游戏、有向图游戏之SG函数)

    这里写目录标题 经典NIM游戏 Nim游戏属于公平组合游戏ICG 有向图游戏(SG函数) Mex运算 SG函数 单个有向图(一堆石子) 求SG值(记忆化递归) 有向图游戏的和 ,(多个有向图(多堆石子 ...

最新文章

  1. 那个曾被阿尔法狗在围棋领域打哭的男人--柯洁,又夺斗地主全国冠军....
  2. 【nginx学习一】基本原理初探
  3. appium ios 真机自动化环境搭建
  4. 【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档
  5. c语言之优先级 结合性与自增运算,C语言之优先级、结合性与自增运算
  6. ubuntu18.04 本地源制作
  7. html5 restore,HTML5 canvas save和restore方法讲解
  8. win10怎么进入修复计算机,Win10怎么进入安全模式以及Win10:使用Windows恢复环境轻松修复...
  9. 分享几种设为首页的代码
  10. AIOT在数字化转型中的机遇和挑战
  11. PHP鲜花销售管理系统毕业设计
  12. HTML图片热区map area的用法整理
  13. 去掉最低工资和最高工资后的工资平均值(Java实现2种算法)
  14. IT技术人员 35岁 (转)
  15. Dcloud云函数服务空间
  16. [databinding] ... ... conflicts with another tag that has the same ID
  17. 【AUTOSAR-CP-CAN-2】AUTOSAR COM
  18. finalshell - 新建并连接服务
  19. 基于NodeJs的爬虫
  20. 配置pppoe服务器

热门文章

  1. 【Go】Go 错误处理
  2. R语言绘图技巧之显示希腊字母
  3. 【转载】 恢复百度云同步盘本地误删的文件(2篇)
  4. 中国机械式停车设备行业投资建议与发展机遇研究报告2022版
  5. Qt运行提示QGtkStyle was unable to detect the current GTK+ theme.解决方法
  6. 如何粉碎文件 - C#
  7. 网络聊天程序的设计与实现
  8. python制作自动交易软件下载_python自动量化交易系统
  9. 背单词-项目设计文档
  10. 02前端入门HTML5 +CSS3+电商网页制作:CSS