拆分Nim游戏

2023-11-09

拆分Nim游戏

给定n堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆规模更小的石子(新堆规模可以为0,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数n。
第二行包含n个整数,其中第i个整数表示第i堆石子的数量ai。

输出格式

如果先手方必胜,则输出“Yes”。
否则,输出“No”。

数据范围

1≤n,ai≤100

输入样例

2
2 3

输出样例

Yes

题目分析

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

Mex运算
设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,即:
mex(S) = min{x}, x属于自然数,且x不属于S

对于该题可能存在多种上述的不同的有向图,即多个SG函数的值。
由于在该题中我们每一堆石子均可操作,且有集合S内元素的情况。因此我们可以得到每一堆地SG值而后对每一堆地SG值进行异或计算。结果为0则先手必败,否则为先手必胜。
使用异或的结果来判断的原因参考经典Nim游戏的结论·。

对于拆封Nim游戏
首先由题目可知对于每次操作我们可以拿去一堆石子,并拿回另外两堆石子,且石子小于被拿走的堆。
因此可以使用sg函数对每一堆进行计算,(注:此处对于每一堆的拆分时,我们需要计算后续的每种拆分的
可能,同时由于计算中可能出现需要计算大量重复的堆数的sg值,因此此处可以使用记忆化搜索记录已经计算
过的特定堆数的sg值,以优化计算时间。)

此处拆分某一堆可能存在如下图情况。
设某一堆的数量为5
则可以得到情况1
在这里插入图片描述

当然也存在另一种的划分情况
如下图
在这里插入图片描述

除上述情况还有其他情况存在,需要计算其他情况

因此这样的情况,同时对于5有其他的拆分请况,我们需要计算出所有的请情况的sg值,取除了
集合中sg值外的最小值则为答案

代码如下

#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N=110;
int n,sg[N],ans;
int getsg(int t)
{
    if(sg[t]!=-1)return sg[t];
    unordered_set<int> map;
    for(int i=0;i<t;i++)
    for(int j=i;j>=0;j--)
        map.insert(getsg(i)^getsg(j));
    for(int i=0;;i++)if(!map.count(i))return sg[t]=i;
}
int main()
{
    cin>>n;
    memset(sg,-1,sizeof(sg));
    for(int i=0;i<n;i++)
    {
        int a;
        cin>>a;
        ans^=getsg(a);
    }
    ans?cout<<"Yes":cout<<"No";
    return 0; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拆分Nim游戏 的相关文章

  • 区块链学习路线图!

    分享关于区块链的学习的大致方向和路线
  • [519]matplotlib(二)

    3D 散点图绘制 scatter from mpl toolkits mplot3d import Axes3D import numpy as np from matplotlib import pyplot as plt 生成3D示例数
  • 虚拟化技术基础汇总(特全,初学者值得一看)

    虚拟化意味着应用程序可以使用一个资源 而不必担心它驻留在哪里 技术接口是什么 它是如何实现的 它使用的平台以及它有多少可用 里克 F 范德兰斯 目录 一 什么是虚拟化 1 虚拟化概念 2 虚拟化的类型 服务器虚拟化 网络虚拟化 桌面虚拟化
  • Pandas--DataFrame修改值

    pandas要修改值先需要了解DataFrame的一些知识 此处参照的是pandas的官方文档 When setting values in a pandas object care must be taken to avoid what
  • STM32学习笔记

    STM32笔记 STM32笔记 ADC TIM定时器 定时中断基本结构 代码配置 PWM PWM初始化 EXTI外部中断 NVIC基本结构 EXIT简介 代码配置 GPIO输出 单独操作输出数据寄存器的某一位的方法 GPIO8种模式 代码操
  • wireshark:界面介绍

    菜单栏 文件 打开文件集 保存包 导出HTTP对象 编辑 清除所有标记的包 忽略包和时间属性 视图 查看 隐藏工具栏和面板 编辑Time列 重设颜色 跳转 捕获 分析 创建显示过滤器宏 查看启用协议 保存关注解码 统计 创建图表并打开各种协
  • 网络空间安全进入动态防御时代

    现代计算机网络中包括各种各样的设备和软件 这些设备和软件存在着大量的未知和已知漏洞 漏洞是安全问题的根本 在漏洞面前 攻守双方并不平等 一个弱点被黑客利用 最终可以导致危险在整个网络扩散 漏洞具有的高威胁性 突发性 高破坏性 大规模性的主要

随机推荐

  • Introduction to Data-Centric AI 以数据为中心的人工智能导论

    文章目录 前言 一 Data Centric AI vs Model Centric AI 二 Label Errors and Confident Learning 1 引入库 2 读入数据 总结 前言 本博客笔记来源于MIT的课程 In
  • keil5安装出现error:A1023E等信息

    这是因为在安装的时候没有将环境变量配置好 应该配置如下
  • 国家大力发展集成电路,是否意味着微电子行业在中国前景可以?

    集成电路是信息化 数字化的基石 是全球信息产业的基础 用于通信 安防 军事 工业 交通 消费电子等领域 现在的消费电子 互联网 数字图像 网络通信 云计算 大数据 人工智能发展都得靠它 而在国家安全 经济 日常生活中是不可或缺的 如果是这种
  • 前端笔试题

    目录 1 选择器的优先级 从上往下依次降低 是 2 下述有关 border none 以及 border 0 的区别 描述错误的是 3 关于a元素 以下说法正确的有 4 History对象的属性或方法描述正确的是 5 在HTML5中 为in
  • Matlab中的点数据生成图

    目录 简单的背景介绍 尝试plot3 构造矩阵 遍历填充 无优化版遍历填充 优化后的遍历填充 简单的背景介绍 今天蠢师弟用comsol导出了一个模拟数据 用matlab打开一看是一个数据长度 189739 3 189739 3 189739
  • 嵌入式物联网毕业设计选题智能图像识别项目-stm32mp157 linux开发板

    stm32mp157开发板FS MP1A是华清远见自主研发的一款高品质 高性价比的Linux 单片机二合一的嵌入式教学级开发板 开发板搭载ST的STM32MP157高性能微处理器 集成2个Cortex A7核和1个Cortex M4 核 A
  • R语言第八次课堂小测 rattle的应用(包括rattle的安装)

    题目 安装rattle 并使用rattle 用三种聚类方法对鸢尾花数据集进行聚类 步骤一 修改镜像源 首先 在Rstudio上打开如下界面 进入后 找到packages 再点击change 下图是已经更换了的截图 选择中国的任意一个镜像 最
  • ./configure之后报错

    首先要看报的错误是什么 一般从第一条开始解决 因为有可能下面的错误是由上面的导致的
  • js 判断变量类型(完整版),包括ES6 新类型Symbol

    欢迎来到Altaba的博客 相信大家在开发中遇到需要判断变量类型的问题 js变量按存储类型可分为值类型和引用类型 值类型包括Undefined String Number Boolean 引用类型包括object Array Functio
  • 股票和期货的区别(股指期货1个点赚多少钱)

    股票和期货的辨别 股票的最后含意即是说不妨表明你购置了这家公司的股子 而期货 则是买卖两边按照各自对目标物的将来价钱预期 以此刻的价钱签署的合约 观念既是仍旧领会了 那咱们就再领会一下这几个的辨别 1 目标物 目标物也即是买卖东西 菜商场里
  • 【深度学习】SETR:基于视觉 Transformer 的语义分割模型

    Visual Transformer Author louwill Machine Learning Lab 自从Transformer在视觉领域大火之后 一系列下游视觉任务应用研究也随之多了起来 基于视觉Transformer的语义分割正
  • OpenMMLab AI实战营第二期(2)MMPose初体验

    根据MMPose的官方文档学习一下 MMPose文档地址 https mmpose readthedocs io zh CN latest index html 文章目录 1 概述 2 安装 2 1 创建conda环境并激活 2 2 安装p
  • mysql锁

    想要了解锁 必须要知道mysql事务 以及mysql事务产生的并发问题 数据库中的事务 隔离级别 以及数据展示 華同学 的博客 CSDN博客 1 Mysql锁的介绍 锁是计算机协调多个线程或进程并发访问某一资源的机制 除传统的计算机资源 C
  • sentencepiece原理与实践

    1 前言 前段时间在看到XLNET Transformer XL等预训练模式时 看到源代码都用到sentencepiece模型 当时不清楚 经过这段时间实践和应用 觉得这个方法和工具值得NLP领域推广和应用 今天就分享下sentencepi
  • Vscode + php + xdebug 单步调试

    1 确认xdebug已打开 php ini xdebug remote enable 1 xdebug remote autostart 1 xdebug remote host localhost xdebug remote port 9
  • win32汇编基础概念

    一 关于寄存器 寄存器有EAX EBX ECX EDX EDI ESI ESP EBP等 似乎IP也是寄存器 但只有在CALL RET在中会默认使用它 其它情况很少使用到 暂时可以不用理会 EAX是WIN32 API 默认的返回值存放处 E
  • 深入理解机器学习与极大似然之间的联系

    似然函数 事件A的发生含着有许多其它事件的发生 所以我就把这些其它事件发生的联合概率来作为事件A的概率 也就是似然函数 数据类型的不同 离散型和连续性 就有不同的似然函数 极大似然极大似然估计方法 Maximum Likelihood Es
  • sqli-labs:less-27(过滤select和union)

    div div
  • eosjs v20 如何通过jsonrpc连接到主网节点

    用eosjs连接主网节点很简单 只需要在创建JsonRpc对象时 指定要连接主网节点的地址 就可以了 例如 下面的代码将创建一个使用eosnewyork io节点RPC旳JsonRpc 对象 然后使用get info 方法获取网络总体信息
  • 拆分Nim游戏

    拆分Nim游戏 给定n堆石子 两位玩家轮流操作 每次操作可以取走其中的一堆石子 然后放入两堆规模更小的石子 新堆规模可以为0 且两个新堆的石子总数可以大于取走的那堆石子数 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜