博弈论:Nim游戏

简介: 博弈论:Nim游戏

给定 n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。


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


输入格式

第一行包含整数 n。


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


输出格式

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


否则,输出 No。

数据范围

1≤n≤10^5,

1≤每堆石子数≤10^9

输入样例:
1. 2
2. 2 3
输出样例:
Yes

思路:

必败态:此状态的玩家,不论怎么操作都会输


必胜态:此状态的玩家,总是可以通过一定的操作,使得下一次对手拿到的状态为必败态度。


在此题目中 假定a1 a2....an都为0,则他们异或为0,此时为必败态,因为拿到这个状态的人无法操作。


反之如果异或值不是0,则可通过一定操作使得异或值为0。


证明非0态可以转化为0态(即必胜态可以留给对手必败态):

假定a1^a2^....an = x, x的二进制表示中最高一位1在第k位上

则a1~an中必有一个数ai,ai的第k位是1,得出结论ai ^ x < ai


我们再从ai中取得(ai - (ai ^ x))数目的石子


则ai中的石子数目为 ai - (ai - (ai ^ x))  = ai ^ x


所以现在式子变成a1^a2^...^ai^x^...^an


因为a1^....an = x


所以现在式子简化为x ^ x = 0


局面已经是必败态了


局面已经是必败态了

#include  <iostream>
using namespace std;
int main(){
    int n,x;
    cin>>n;
    int res=0;
    while(n--){
        cin>>x;
        res^=x;
    }
    if(res)cout<<"Yes";
    else cout<<"No";
}
台阶Nim

现在,有一个 n级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 ai 个石子(i≥1)。

两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。


已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。


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


输入格式

第一行包含整数 n。


第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 ai。


输出格式

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


否则,输出 No。

数据范围

1≤n≤10^5

1≤ai≤10^9

输入样例:
1. 3
2. 2 1 3
输出样例:
Yes

这里将输入的每个ai异或换成输入的每个奇数异或就行。

#include  <iostream>
using namespace std;
int main(){
    int n,x;
    cin>>n;
    int res=0;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(i%2)res^=x;
    }
    if(res)cout<<"Yes";
    else cout<<"No";
}
相关文章
阿里云商标注册入口(查询/申请/交易/管理)
阿里云商标注册页面、商标自助申请系统、商标近似查询、商标交易、商标管理后台、商标续展等操作入口
6107 5
阿里云商标注册入口(查询/申请/交易/管理)
|
存储 监控 算法
详解SIP服务器用来做什么的
什么是SIP服务器? SIP服务器是IPPBX的主要组成部分,主要处理网络中所有SIP呼叫的管理。SIP服务器也称为SIP代理或注册器。SIP是SIP服务器的主要组件,负责建立网络中所有的SIP电话通话。SIP服务器也叫SIP代理服务器或注册服务器。
4507 0
详解SIP服务器用来做什么的
|
机器学习/深度学习 算法 数据挖掘
【机器学习】算法术语、决策函数、概率模型、神经网络的详细讲解(图文解释)
【机器学习】算法术语、决策函数、概率模型、神经网络的详细讲解(图文解释)
1136 1
|
Oracle 关系型数据库 JavaScript
kernel.shmmax ,kernel.shmmni 和kernel.shmall
[2014-07-23 14:03:41](javascript:;) kernel.shmmax = 2147483648 // 该参数定义了共享内存段的最大尺寸(以字节为单位)。
6089 0
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
588 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
8月前
|
人工智能 自然语言处理 JavaScript
17种RAG实现方法大揭秘
RAG(检索增强生成)通过结合外部知识库与LLM生成能力,有效解决大模型知识滞后与幻觉问题。本文详解三类策略、17种实现方案,涵盖文档分块、检索排序与反馈机制,并提供工程选型指南,助力构建高效智能系统。
1820 0
|
存储 数据处理 索引
MATLAB中的基本数据类型与变量操作
【10月更文挑战第1天】 MATLAB 是一种广泛应用于数学计算和科学研究的编程语言,其核心是矩阵运算。本文详细介绍了 MATLAB 中的基本数据类型,包括数值类型(如 `double` 和 `int`)、字符数组、逻辑类型、结构体、单元数组和函数句柄,并通过代码示例展示了变量操作方法。
|
SQL 安全 前端开发
全栈开发者必看!前后端表单交互的最佳实践与安全考量,开启高效稳定开发之旅!
【8月更文挑战第31天】全栈开发者在软件开发中扮演着重要角色,需精通前端与后端技术。表单交互是常见的开发场景,涉及从设计直观表单到处理数据等多个环节。前端应使用清晰标签和验证提示提升用户体验,如用红色星号标示必填项;后端需严格验证数据并处理细节,如去除空格和转换类型。此外,安全防护同样关键,包括防止脚本注入和SQL攻击。遵循这些最佳实践,全栈开发者能构建稳定、安全的应用程序,不断提升用户体验。
365 1

热门文章

最新文章