博弈论(NIM游戏——取石子)相关的题目

简介: 博弈论(NIM游戏——取石子)相关的题目

1.异或的性质

image.png

🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈🏳️‍🌈


2.nim游戏 (基础)


891. Nim游戏 - AcWing题库


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


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


输入格式


第一行包含整数 n。


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


输出格式


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


否则,输出 No。



例如:有两堆石子,第一堆有2个,第二堆有3个,先手必胜。


操作步骤:

1. 先手从第二堆拿走1个,此时第一堆和第二堆数目相同

2. 无论后手怎么拿,先手都在另外一堆石子中取走相同数量的石子即可。


先手必败状态:a1 ^ a2 ^ a3 ^ ... ^an = 0

先手必胜状态:a1 ^ a2 ^ a3 ^ ... ^an ≠ 0  

#include <iostream>
#include <cstdio>
using namespace std;
/*
先手必胜状态:先手操作完,可以走到某一个必败状态
先手必败状态:先手操作完,走不到任何一个必败状态
先手必败状态:a1 ^ a2 ^ a3 ^ ... ^an = 0
先手必胜状态:a1 ^ a2 ^ a3 ^ ... ^an ≠ 0
*/
int main(){
    int n;
    scanf("%d", &n);
    int res = 0;
    for(int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        res ^= x;
    }
    if(res == 0) puts("No");
    else puts("Yes");
}

3.nim游戏(变形)


892. 台阶-Nim游戏 - AcWing题库


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


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


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


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


输入格式


第一行包含整数 n。


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


输出格式


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


否则,输出 No。


此时我们需要将奇数台阶看做一个经典的Nim游戏,如果先手时奇数台阶上的值的异或值为0,则先手必败,反之必胜


证明:

先手时,如果奇数台阶异或非0,根据经典Nim游戏,先手总有一种方式使奇数台阶异或为0,于是先手留了奇数台阶异或为0的状态给后手

于是轮到后手:

①当后手移动偶数台阶上的石子时,先手只需将对手移动的石子继续移到下一个台阶,这样奇数台阶的石子相当于没变,于是留给后手的又是奇数台阶异或为0的状态

②当后手移动奇数台阶上的石子时,留给先手的奇数台阶异或非0,根据经典Nim游戏,先手总能找出一种方案使奇数台阶异或为0


只异或奇数的,不异或偶数的,因为最后要把石子都放到地面,地面是第0层(偶数层,如果算上地面的,也许会多一层,个人理解)

#include <iostream>
using namespace std;
int main()
{
    int res = 0;
    int n;
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        int x;
        cin >> x;
        if(i % 2==1) res ^= x;//只异或奇数的
    }
    if(res==0) puts("No");
    else puts("Yes");
    return 0;
}

6.1.png

⭐⭐⭐代码中,先都异或了一遍,然后把

修改的位置的原来的数修改了的数又异或了一遍

刚开始以为这不是重复了吗

其实不是,以为相同的数异或为0,0异或任何数还为原数

那么 修改的位置的原来的数异或后是0,并不影响

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5+5;
int a[N];
signed main(){
    int n,q,x,y;
    cin>>n>>q;
    int sum = 0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum^=a[i];
    }
    while(q--){
        cin>>x>>y;
        sum^=a[x];
        sum^=y;
        a[x] = y;
        if(sum!=0){
            cout<<"Kan"<<endl;
        }
        else{
            cout<<"Li"<<endl;
        }
    }
    return 0;
}

Code over!

相关文章
|
2月前
|
监控 API 数据安全/隐私保护
OpenClaw阿里云/本地台部署+商业落地指南|5类实战案例+API配置与避坑要点
2026年,OpenClaw(Clawdbot)已从技术工具演进为具备商业落地能力的经济代理载体,其核心价值并非直接“生成收益”,而是通过自动化执行、实时数据监控、决策效率提升构建竞争优势,最终转化为可量化的经济价值。通过对公开案例的梳理发现,成功的商业落地多集中在决策辅助、自动化流程、知识服务三大方向,而落地的前提是完成稳定的部署与合理的模型配置。本文结合5个真实商业案例,拆解OpenClaw的商业应用逻辑与避坑要点,完整提供阿里云及本地多系统部署流程、免费大模型API配置方法,形成一套“部署-配置-落地-避坑”的完整方案,全程不含营销词汇,兼顾实用性与可操作性。
581 0
|
监控 Java Shell
基于python+uiautomator2,2020.12月最新库的使用方法,更新watcher使用方法(三)
WatchContext,目前的这个watch_context是用threading启动的,每2s检查一次 目前还只有click这一种触发操作
1982 0
|
3月前
|
人工智能 安全 C++
一个项目能长期活下去,靠的从来不是模型
AI项目成败关键不在模型强弱,而在于系统性生存能力:厘清责任边界、接纳不确定性、严控复杂度、建立止损机制、允许模型“不万能”、并在模型成功时保持克制。真正活久的项目,清醒、务实、敬畏现实。
|
4月前
|
存储 弹性计算 运维
阿里云轻量应用服务器全解析:实例类型、规格性能、使用优势及问题解答FAQ
阿里云轻量应用服务器,专为建站、开发测试等场景设计,具备轻量化、贴近应用、成本可控、可进化四大优势。提供五大实例类型,适配多元需求,200Mbps带宽起步,38元/年起,助力用户高效上云。
|
存储 数据管理 网络虚拟化
特殊网络类型分类
本文介绍了网络技术中的关键概念,包括虚拟局域网(VLAN)、存储区域网络(SAN)、网络桥接、接入网以及按拓扑结构和交换方式分类的网络类型。VLAN通过逻辑分隔提高性能与安全性;SAN提供高性能的数据存储解决方案;网络桥接实现不同网络间的互联互通;接入网解决“最后一千米”的连接问题。此外,文章详细对比了总线型、星型、树型、环型和网状型等网络拓扑结构的特点,并分析了电路交换、报文交换和分组交换的优缺点,为网络设计与应用提供了全面参考。
492 8
|
消息中间件 人工智能 弹性计算
《文档智能 & RAG让AI大模型更懂业务》解决方案评测
一文带你了解《文档智能 & RAG让AI大模型更懂业务》解决方案的优与劣
531 13
|
JavaScript 容器
技术经验解读:【详解】提示框(tooltip)的使用
技术经验解读:【详解】提示框(tooltip)的使用
|
数据采集 Web App开发 JavaScript
Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能
大概还是入门期,我曾用Puppeteer做爬虫工具以此来绕过某网站的防爬机制。近期有需求要做任意链接网页截图,像这种场景非常适合用Puppeteer完成。无头浏览器我已知的还有Selenium。
797 2
Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
707 1

热门文章

最新文章