博弈论和sg函数

Nim游戏

题目链接:Nim游戏

先说结论:假设n堆石子,石子数分别为a1,a2,a3.....,则当a1^a2^a3^...^an=0时先手必败,否则先手必胜。

因为所表示的二进制位必定是成对出现的,根据性质 1 ^ 1 = 0 ,0 ^ 0 = 0 得出结论。(具体证明过程不再说明)

因此代码如下:

#include <bits/stdc++.h>
using namespace std;
int n;int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;int ans=0;for(int i=1;i<=n;i++){int x;cin>>x;ans^=x;}if(!ans)cout<<"No"<<"\n";else cout<<"Yes"<<"\n";return 0;
}

台阶-Nim游戏

题目链接:台阶-Nim游戏

首先给出结论:所有奇数阶的石子个数异或,如果异或和为0,那么先手必败,否则先手必胜。

因为从第一阶拿下来石子要取1次,第二阶拿下来要取2次。。。。。以此类推,所以可以看成第二阶有两堆石子,第三阶有三堆石子,因为两堆相同数量的石子异或和必然为0,而奇数阶的石子异或和为本身,所以只需将奇数阶的石子异或计算即可。

#include <bits/stdc++.h>
using namespace std;
int n;int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;int ans=0;for(int i=1;i<=n;i++){int x;cin>>x;if(i&1)ans^=x;}if(!ans)cout<<"No"<<"\n";else cout<<"Yes"<<"\n";return 0;
}

集合-Nim游戏

题目链接:集合-Nim游戏

SG函数

这道题目用到了SG函数,那么首先介绍一下什么是SG函数以及用法:

首先定义MEX集合表示集合中最小的没有出现的自然数,如MEX{1,2}=0,MEX{0,1,2}=3.

首先看左边这个图,我们把终点定义为sg(终点)=0;因为终点不能到达其他点,然后终点的前面一个点定义为sg(x)=1,因为后面有0,以此类推我们可以画出sg图。

那么SG函数具体的作用是什么呢?

首先终点的sg为0,意味着不能进行任何操作,在博弈论中意味着失败,那么当sg为0时,判负,相反,当sg不为0时,一定有一条路可以从该点走向sg(x)= 0,那么也就意味着如果先手不为0,那么一定可以让后手变为0.

接下来看题目,假设一堆有10个石子,我可以通过拿2个或5个使石子不能再拿,因此可以一个个枚举石子剩余的个数,如右图。接下来算出每个点的sg值,由图可知sg(10)=1,因此可以走到0让对手失败。

那么一堆是这样,n堆便用例题1的知识得:所有堆的sg异或和如果为0,先手必败,否则先手必胜。

#include <bits/stdc++.h>
using namespace std;
const int N =1e5+5;
int f[N],a[N];
int n,m;int sg(int x){if(f[x]!=-1)return f[x];//记忆化搜索unordered_set<int>s;for(int i=1;i<=m;i++){if(x>=a[i]){s.insert(sg(x-a[i]));}}for(int i=0;;i++){if(!s.count(i))return f[x]=i;}}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);memset(f,-1,sizeof(f));cin>>m;for(int i=1;i<=m;i++){cin>>a[i];}int ans=0;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;ans^=sg(x);}if(!ans)cout<<"No"<<"\n";else cout<<"Yes"<<"\n";return 0;
}

拆分-Nim游戏

题目链接:拆分-Nim游戏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对 Seata 的理解

在微服务架构下&#xff0c;由于数据库和应用服务的拆分&#xff0c;导致原本一个事务单元中的多个DML操作&#xff0c;变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作&#xff0c;而传统的数据库事务无法解决这类的问题&#xff0c;所以就引出了分布式事务的概念。 …

Linux命令-dstat命令(通用的系统资源统计工具)

说明 dstat命令 是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具&#xff0c;是一个全能系统信息统计工具。与sysstat相比&#xff0c;dstat拥有一个彩色的界面&#xff0c;在手动观察性能状况时&#xff0c;数据比较显眼容易观察&#xff1b;而且dsta…

Pytorch:张量的形状操作

文章目录 一、维度改变1.flatten展开a.函数的基本用法b.示例 2.unsqueeze增维a.函数的基本用法b.示例 3.squeeze降维a.函数的基本用法b.示例 二、张量变形1.view()a.函数的基本用法b.参数&#xff1a;c.注意事项d.示例 2.reshape()a.注意事项b.示例 3.reshape_as()a.函数的基本…

深入理解 pytest Fixture 方法及其应用

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

css中backface-visibility使用

backface-visibility 是一个 CSS 属性&#xff0c;用于控制元素的背面是否可见。它主要用于在进行3D转换时控制元素的背面可见性。当一个元素被旋转或进行其他3D变换时&#xff0c;通常浏览器默认会进行背面剪裁&#xff08;backface culling&#xff09;&#xff0c;使得元素的…

DAY29| 491.递增子序列 ,46.全排列 ,47.全排列II

文章目录 491.递增子序列46.全排列47.全排列II 491.递增子序列 文字讲解&#xff1a;递增子序列 视频讲解&#xff1a;递增子序列 **状态&#xff1a;这题看了文字讲解才AC&#xff0c;掌握了如何在回溯里通过Set集合来对同层节点去重 思路&#xff1a; 代码&#xff1a; cla…

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…

「Python大数据」数据采集-某东产品数据评论获取

前言 本文主要介绍通过python实现数据采集、脚本开发、办公自动化。数据内容范围:星级评分是1-3分、获取数据页面是前50页。 友情提示 法律分析:下列三种情况,爬虫有可能违法,严重的甚至构成犯罪: 爬虫程序规避网站经营者设置的反爬虫措施或者破解服务器防抓取措施,非法…

arm 作业 24/4/17

1、主机向从机发送多个字节的数据 主机发送起始信号 主机发送8bit从机地址1bit写标志&#xff08;0&#xff09; 从机回应应答信号 主机发送8bit从机的寄存器地址 从机回应应答信号 主机发送8bit数据 从机回应应答 主机发送8bit数据 从机回应应答 ………… 主机发起…

【Pytorch】Conv1d

conv1d 先看看官方文档 再来个简单的例子 import torch import numpy as np import torch.nn as nndata np.arange(1, 13).reshape([1, 4, 3]) data torch.tensor(data, dtypetorch.float) print("[data]:\n", data) conv nn.Conv1d(in_channels4, out_channels1…

二叉树前序遍历​​​​​​​到底部为何会返回到顶部?函数调用栈

前序遍历是一种二叉树的遍历方式&#xff0c;其遍历顺序是先访问根节点&#xff0c;然后递归地遍历左子树&#xff0c;最后递归地遍历右子树。具体来说&#xff0c;前序遍历的顺序是根节点->左子树->右子树。 前序遍历到底部为何会返回到顶部是因为在进行递归遍历时&…

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

32、模拟队列

模拟队列 题目描述 实现一个队列&#xff0c;队列初始为空&#xff0c;支持四种操作&#xff1a; (1) “push x” – 向队尾插入一个数x&#xff1b; (2) “pop” – 从队头弹出一个数&#xff1b; (3) “empty” – 判断队列是否为空&#xff1b; (4) “query” – 查询…

【Git】git命令大全(持续更新)

本文架构 0.描述git简介术语 1.常用命令2. 信息管理新建git库命令更改存在库设置获取当前库信息 3.工作空间相关将工作空间文件添加到缓存区&#xff08;增&#xff09;从工作空间中移除文件&#xff08;删&#xff09;撤销提交 4.远程仓库相关同步远程仓库分支 &#xff08;持…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

yolov5 自训练pt模型转onnx,再转rknn,并部署 注意事项

yolov5 部署到rk3588 教程来自 yolov5训练pt模型并转换为rknn模型&#xff0c;部署在RK3588开发板上——从训练到部署全过程_yolov5 rknn-CSDN博客 1.通过android studio 部署代码在rk3588板子上运行代码 项目来源 rknn-toolkit2/rknpu2/examples/rknn_yolov5_android_apk…

使用AWK进行文本处理

awk 的基本概念 awk 是一种强大的文本处理语言&#xff0c;广泛用于模式匹配和数据提取。这种编程语言设计用于对文本文件进行操作&#xff0c;尤其适用于格式化的文本&#xff0c;如 CSV 或空格分隔的表格数据。下面详细介绍 awk 的一些基本概念&#xff1a; 1. 记录和字段 …

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时&#xff08;container runtime&#xff09;&#xff1b;想讲清楚他们两之间的关系&#xff0c;让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI&#xff08;open container initiative&#xff09; OCI是容器标准化组织为了…

利用动态规划优化10年投资回报:策略、证明与算法分析

利用动态规划优化10年投资回报&#xff1a;策略、证明与算法分析 a. 存在最优投资策略的证明b. 最优子结构性质的证明c. 最优投资策略规划算法设计d. 新限制条款下最优子结构性质的证明 在面对投资策略规划问题时&#xff0c;我们的目标是在10年后获得最大的回报。Amalgamated投…