nim博弈
Posted wangzhe52xia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nim博弈相关的知识,希望对你有一定的参考价值。
原题链接 :https://www.acwing.com/problem/content/893/
给定nn堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
输入格式
第一行包含整数nn。
第二行包含nn个数字,其中第 ii 个数字表示第 ii 堆石子的数量。
输出格式
如果先手方必胜,则输出“Yes”。
否则,输出“No”。
数据范围
1≤n≤1051≤n≤105,
1≤每堆石子数≤1091≤每堆石子数≤109
输入样例:
2
2 3
输出样例:
Yes
nim 博弈,是简单博弈也是我对博弈学习的开始
这类博弈可以看成 两种状态 :
- 先手必胜:当所有值得异或值不等于零时,先手一定可以经过某种操作变成零,后手又会把零变成非零,最后险收益指不是零,后手会遇到最后的零
先手必败:反过来当所有值得异或值等于零时,先手都会使零变成非零,后手始终是将非零变成零,后手必胜
代码:
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 7 using namespace std; 8 9 int main() 10 11 int n; 12 cin >>n; 13 int res=0; 14 while(n--) 15 16 int x; 17 cin >> x; 18 res = res^x; 19 20 if(res)puts("Yes"); 21 else puts("No"); 22 return 0; 23
以上是关于nim博弈的主要内容,如果未能解决你的问题,请参考以下文章