HDU - 2176 取(m堆)石子游戏(尼姆博奕)
题目链接:点击查看
题目大意:给出m堆石子,规则是尼姆博弈的规则,问先手必胜还是必败,若能必胜则第一次有多少种方式取石子
题目分析:这个题目是因为一开始知道尼姆博弈的结论,需要异或所有石子来判断的,然后关于最后第一次该怎么取石子,还是在训练的时候自己乱推出来的。。至于是为什么当时还是不知道的,现在来稍微分析一下
我们已经知道了尼姆博弈的结论,即设ans为所有石子的异或值了:
a1^a2^...^an=ans
如果ans为0,那么先手必败,如果ans不为0,则先手必胜,必胜的条件下,我们接下来需要寻找该怎么取石子能让局面达到奇异局面,也就是必败局面,即让新的石子异或后变为0
我们假设需要改变一堆石子ai,变为ai',则他们的关系是:
ai'=ai^ans
我们代入上面的第一个公式中:
a1^a2^...^ai'^...^an=a1^a2^...^ai^ans^...^an=ans^ans=0
这样就能变成奇异局面了,因为这是取石子游戏,必须满足ai'严格小于ai才行,即需要满足:
ai'<ai,即ai^ans<ai
满足上述条件的ai'就是答案了
还是需要注意一下,异或属于位运算,他的优先级比==要低,记得加括号来保证正确的运算顺序
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;typedef long long LL;const int N=2e5+100;int a[N];int main()
{int n;while(scanf("%d",&n)!=EOF&&n){int ans=0;for(int i=1;i<=n;i++){scanf("%d",a+i);ans^=a[i];}if(!ans)puts("No");else{puts("Yes");for(int i=1;i<=n;i++){if((a[i]>(ans^a[i])))printf("%d %d\n",a[i],ans^a[i]);}}}return 0;
}
HDU - 2176 取(m堆)石子游戏(尼姆博奕)相关推荐
- 杭电 2176 取(m堆)石子游戏(博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM-尼姆博弈之取(m堆)石子游戏——hdu2176
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDUOJ-----2175取(m堆)石子游戏
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU2176 取(m堆)石子游戏【Nim博弈】
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)
题目链接:点击查看 题目大意:两个人在玩游戏,给出一个 3 * 3 的棋盘,每个格子上有数个石子,两人轮流取石子,谁先取完某一列或某一行的最后一个石子就算胜利,一般情况是,每个人可以取任意一堆中任意数 ...
- c语言 Nimm game算法,尼姆博奕(Nimm Game)
尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某 ...
- 关于博弈基础知识的总结:巴什博弈(Bash Game)、威佐夫博奕(Wythoff Game)、尼姆博奕(Nim Game)
转载自http://www.aiuxian.com/article/p-942548.html 博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论. 基础的基础 ...
- 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板
1.巴什博奕 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够 ...
- 博弈基础与例题分析(巴什博弈威佐夫博弈尼姆博奕 斐波那契博弈SG博弈)
文章目录 巴什博弈Bash Game 威佐夫博弈Wythoff Game 尼姆博奕 斐波那契博弈:算法如其名 SG博弈 图 mex(minimal excludant)运算 获得sg表 应用 A Br ...
最新文章
- 【python】解压文件
- 线程编程常见API简介(中)
- c primer plus(第五版)读书笔计 第四章(1)
- mxOutlookBarPro中,button是通过for语句动态生成的,如何取得当前单击button的标题呢?...
- Linux find命令批量替换字符串find roles/hadoop_ha/vars/ -name “*.yml“ |xargs perl -pi -e ‘s|node135|node108|g‘
- java读取gradle属性,Spring Boot获取Gradle中包的属性
- Pythonseleniumtesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考...
- springboot 配置webservice接口
- 8位可控加减法器_行测高分技巧-资料分析之有效数字加减法取舍
- macOS开启内建的TFTP服务器
- 最短路 dijkstra模板
- Maple 教程 何青,科学出版社
- 企业erp系统对企业预算和采购环节的作用
- java走台阶_走台阶算法 java实现
- 【SRS】ATC模式和时间抖动矫正
- 大话神仙仙旅奇缘答案大全
- 分号与逗号的区别及举例_怎样区别顿号、逗号和分号
- 小程序占服务器空间吗,小程序会占用手机存储空间吗?| 小程序问答 #21
- java传智百度_2018年4月传智黑马java
- 温湿度模块 DHT11/12 芯片 协议解析 - 简单易懂协议详解