nim游戏

给定n堆物品,第i堆物品有Ai个,两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品的人获胜。


定理:nim游戏先手必胜,当且仅当A1 xor A2 xor ... xor An != 0

xor 不进位加法

从无到有的过程是最难的,nim游戏是困扰了多少代人的难题!

定理证明(参考算阶)

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n;cin >> n;
  6. int res = 0;
  7. while(n --)
  8. {
  9. int x; cin >> x;
  10. res ^= x;
  11. }
  12. if(res) puts("Yes");
  13. else cout << "No" << endl;
  14. return 0;
  15. }

Mex运算

Mex运算就是除去本身以外其他非负整数的集合中的最小值,如MEX{1}=0,MEX{0,1,2,4,5}=3

SG函数

在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,···,yk,定义SG(x)为x的后继结点y1,y2,···,yk的SG函数值构成的集合再执行Mex运算的结果,即:
SG(X) = mex({SG(y1), SG(y2),···, SG(yk)})

多个SG游戏的最终结果为每个SG函数值的异或和,异或和为0即为必败点,反之为必胜点

  1. 集合-Nim游戏

    题目

    提交记录

    讨论

    题解

    视频讲解

给定 n

堆石子以及一个由 k

个不同正整数构成的数字集合 S

现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S

,最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 k

,表示数字集合 S

中数字的个数。

第二行包含 k

个整数,其中第 i

个整数表示数字集合 S

中的第 i

个数 si

第三行包含整数 n

第四行包含 n

个整数,其中第 i

个整数表示第 i

堆石子的数量 hi

输出格式

如果先手方必胜,则输出 Yes。

否则,输出 No。

数据范围

1≤n,k≤100

,

1≤si,hi≤10000

输入样例:

2

2 5

3

2 4 7

输出样例:

Yes

  1. #include <iostream>
  2. #include <cstring>
  3. #include <unordered_set>
  4. using namespace std;
  5. const int N = 110, M = 10010;
  6. int n, k;
  7. int s[N], f[M];
  8. //用记忆化搜索实现求sg函数
  9. int sg(int x)
  10. {
  11. //定义一个哈希表存x能到达的所有状态
  12. unordered_set<int>S;
  13. //如果当前状态已经到达过了,我们就直接返回,保证每个状态只到达过一次,这样便能保证每个状态不会重复搜索
  14. if(f[x] != -1) return f[x];
  15. //枚举当前状态能到达的所有状态也就是当前结点的所有后继节点
  16. for(int i = 0; i < n; ++ i)
  17. {
  18. int t = s[i];
  19. if(x - t >= 0) S.insert(sg(x - t));
  20. }
  21. //对当前x的所有后继结点进行mex操作
  22. for(int i = 0; ; ++ i)
  23. if(!S.count(i)) return f[x] = i;
  24. }
  25. int main()
  26. {
  27. cin >> n;
  28. memset(f, -1, sizeof f);
  29. for(int i = 0; i < n; ++ i) cin >> s[i];
  30. cin >> k;
  31. int res = 0;
  32. while(k --)
  33. {
  34. int x;cin >>x;
  35. res ^= sg(x);
  36. }
  37. if(res) cout << "Yes" << endl;
  38. else cout << "No" << endl;
  39. return 0;
  40. }

博弈论nim游戏的更多相关文章

  1. 博弈论之Nim游戏

    Nim游戏是组合游戏(Combinatorial Games)的一种,属于“Impartial Combinatorial Games”(以下简称ICG). 通常的Nim游戏的定义是这样的:有若干堆石 ...

  2. 博弈论入门之nim游戏

    更好的阅读体验点这里 nim游戏 nim游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\)堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿),没法拿的人失败.问谁会胜利 ni ...

  3. 【博弈论】浅谈泛Nim游戏

    Nim游戏在ACM中碰到了,就拎出来写写. 一般Nim游戏:有n堆石子,每堆石子有$a_i$个,每次可以取每堆石子中$[0,a_i-1]$,问先手是否有必胜策略. 泛Nim游戏:每堆石子有$a_i$个 ...

  4. [您有新的未分配科技点]博弈论入门:被博弈论支配的恐惧(Nim游戏,SG函数)

    今天初步学习了一下博弈论……感觉真的是好精妙啊……希望这篇博客可以帮助到和我一样刚学习博弈论的同学们. 博弈论,又被称为对策论,被用于考虑游戏中个体的预测行为和实际行为,并研究他们的应用策略.(其实这 ...

  5. Nim游戏与SG函数 ——博弈论小结

    写这篇博客之前,花了许久时间来搞这个SG函数,倒是各路大神的论文看的多,却到底没几个看懂的.还好网上一些大牛博客还是性价比相当高的,多少理解了些,也自己通过做一些题加深了下了解. 既然是博弈,经典的N ...

  6. BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论

    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...

  7. (博弈论)51NOD 1069 Nim游戏

    有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后 ...

  8. 洛谷$P$4301 $[CQOI2013]$新$Nim$游戏 线性基+博弈论

    正解:线性基 解题报告: 传送门! 这题其实就是个博弈论+线性基,,,而且博弈论还是最最基础的那个结论,然后线性基也是最最基础的那个板子$QwQ$ 首先做这题的话需要一点点儿博弈论的小技能,,,这题的 ...

  9. 博弈论入门——Nim游戏引入

    说实话,我真的对这个游戏看得是一脸懵逼,因为(我太弱了)我没有明白一些变量的意思,所以一直很懵,现在才明白,这让我明白博弈论(还可以骗钱)博大精深; 以下是我自己思考的过程,也许不严谨,但是最终明白了 ...

  10. 博弈论(nim游戏,SG函数)

    说到自己,就是个笑话.思考问题从不清晰,sg函数的问题证明方法就在眼前可却要弃掉.不过自己理解的也并不透彻,做题也不太行.耳边时不时会想起alf的:"行不行!" 基本的小概念 这里 ...

随机推荐

  1. [Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(一):SpringIOC概述 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现 ...

  2. 一个从文件中过滤指定字符串的python3脚本

    from tabulate import tabulate plugin = [ ... ] plugin_v1 = [ ... ] filepath = "E:\\PycharmProje ...

  3. IDApython的学习

    IDApython的学习 我的IDA情况:IDA7.7,idapython3.8 这个可以作为文件导入和命令行内输入,我一般习惯命令行 这里要注意是python不是IDC 访问原数据 idc.get_ ...

  4. 三维模型OSGB格式轻量化顶点压缩主要技术方法分析

    三维模型OSGB格式轻量化顶点压缩主要技术方法分析 在三维模型应用中,轻量化处理是提高数据传输效率.减少渲染时间和优化用户体验的重要手段.而OSGB格式是一种常见的三维模型格式,在进行轻量化处理时,顶 ...

  5. ETL之apache hop系列2-hop web安装和入门

    前言 在Docker安装apache hop 首先确保Docker已经安装和运行Java 11 JDK 安装文档参考:https://blog.csdn.net/Chia_Hung_Yeh/artic ...

  6. GitHub Actions CI/CD 工作流实战

    1. 什么是 GitHub Actions 与 workflow ? GitHub Actions 是 GitHub 提供的一种持续集成(CI)和持续部署(CD)的工具,用于自动化软件开发过程中的各种 ...

  7. Mybatis plus配置MetaObjectHandler无效

    项目环境 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-b ...

  8. TIKZ全局样式设置

    tikz绘图引擎 TIKZ绘图引擎是基于tex实现,代码极其复杂,每次编写都要单独设置样式,甚是繁琐,如何能够全局设置呢? \begin{tikzpicture}[ auto, % 决策结点 deci ...

  9. 树状数组复习 leetcode 307

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  10. 一键安装lnmp 环境

    一键安装lnmp 环境 目录 一键安装lnmp 环境 操作步骤 1.添加网站(虚拟主机) 2.伪静态管理 3.上传网站程序 4.已存在虚拟主机添加ssl证书开启https 5.列出网站(虚拟主机) 6 ...