博弈论和sg函数

news2024/11/26 20:34:38

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游戏

这道题目就是对sg函数的加深理解,sg函数有这样一个性质:

sg(b1, b2)=sg(b1)^sg(b2)

相当于一个局面拆分成了两个局面,由SG函数理论,多个独立局面的SG值,等于这些局面SG值的异或和。

可以类比上一道题目,根据sg函数的定义,每一个sg都能走到比自己小的每一个数。这和Nim游戏中的每一堆石子的性质相同,所以可以把每一个sg当成Nim游戏中的一堆石子,异或和就是总体局面的sg。

#include <bits/stdc++.h>
using namespace std;
const int N =105;
int a[N],f[N];
int n;

int sg(int x){
	if(f[x]!=-1)return f[x];
	unordered_set<int>s;
	
	for(int i=0;i<x;i++){
		for(int j=0;j<=i;j++){
			s.insert(sg(i)^sg(j));
		}
	}

	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>>n;
	int ans=0;
	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;
}

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

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

相关文章

MyBatis 源码分析 - 缓存原理

MyBatis 源码分析 - 缓存原理 1.简介 在 Web 应用中&#xff0c;缓存是必不可少的组件。通常我们都会用 Redis 或 memcached 等缓存中间件&#xff0c;拦截大量奔向数据库的请求&#xff0c;减轻数据库压力。作为一个重要的组件&#xff0c;MyBatis 自然也在内部提供了相应的…

量子密钥分发系统的设计与实现(二):光路子系统初步讨论

通过上一篇文章&#xff0c;我们对量子密钥分发系统的基本架构、硬件结构以及密钥分发流程进行了初步的总体介绍&#xff0c;从本文开始&#xff0c;我们就基于系统顶层的架构设计&#xff0c;开始从模块到器件&#xff0c;从硬件到软件开始详细讨论QKD系统的设计与实现。本文主…

【转】这些年背过的面试题——网络和操作系统基础篇

转自&#xff1a;阿里巴巴技术质量 阿里云开发者 阿里妹导读 本文是技术人面试系列网络和操作系统基础篇&#xff0c;面试中关于网络和操作系统基础都需要了解哪些内容&#xff1f;一文带你详细了解&#xff0c;欢迎收藏&#xff01; 网络基础 TCP三次握手 三次握手过程&…

陇剑杯 ios 流量分析 CTF writeup

陇剑杯 ios 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │…

华为云服务镜像手动更换

操作步骤&#xff1a; 1、进入华为云首页点击云容器引擎CCE&#xff1b; 2、选择你所要更换镜像的环境【这里以dev环境演示】&#xff1b; 3、点击dev环境后选择顶部的命名空间&#xff0c;点击【工作负载】中右侧栏的【升级】按钮&#xff1b; 4、点【更换镜像】选择你在test…

压缩感知的概述梳理(1)

参考文献 An efficient visually meaningful image compression and encryption scheme based on compressive sensing and dynamic LSB embedding 基本内容 基本关系梳理 压缩感知核心元素 信号 x 长度&#xff1a;N动态稀疏或可用变换表示&#xff1a;x &#x1d74d;s …

一篇文章带你快速认识区块链(必看)

引言 区块链技术&#xff0c;这一划时代的分布式账本技术&#xff0c;正在全球范围内掀起一场深度的信任与协作模式变革。区块链如同一部由多方共同维护的公开而又安全的大账本&#xff0c;每一笔交易都被打包成一个区块&#xff0c;通过高级密码学手段确保传输和访问安全&…

React中redux、react-redux、@reduxjs/toolkit状态管理库的使用方式

效果 下载依赖 npm install redux react-redux reduxjs/toolkit --save在src目录下创建文件 创建index.ts文件 import { configureStore } from reduxjs/toolkit import userSlice from ./userReducerconst store configureStore({reducer: {user: userSlice.reducer} }) //…

浅析LED节能原理

随着全球对节能环保意识的增强&#xff0c;LED显示屏行业也在积极探索更加节能的生产和使用方式。作为显示屏制造厂家&#xff0c;了解和应用LED节能原理不仅是市场的需求&#xff0c;也是企业履行社会责任的表现。本文将浅析LED节能原理及其在显示屏制造中的应用。 LED节能的基…

关于catkin_make时动态链接库lib缺失问题

原因&#xff1a;GeographicLib未被安装&#xff0c;或者cmakelist链接错误 首先查看是否安装GeographicLib以及对应安装位置 输入dpkg -L libgeographic-dev 找到对应的FindGeographicLib.cmake&#xff0c;前面的/usr/share/cmake/geographiclib就是安装路径&#xff0c;用…

Centos服务器安装MySQL

Centos服务器安装MySQL 利用闲置服务器安装MySQL&#xff0c;用于项目练手 Linux版本&#xff1a;Centos7.9 MySQL版本&#xff1a;8.0.36 一、下载MySQL 从Oracle官网下载最新版本的MySQL wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-1.el7.x86_64.rp…

甘特图:项目管理者的必备神器,如何提高工作效率?

甘特图是什么&#xff1f;项目管理者大多都熟悉甘特图&#xff0c;它是一种直观展示项目计划执行过程的工具。通过条形图来显示项目、任务的时间安排&#xff0c;以及实际进度与计划进度的对比情况。 在我个人的项目管理实践中&#xff0c;甘特图确实帮助我提高了工作效率&am…

js时间格式切割转换

1.原格式&#xff1a;2024-04-16T16:19:23 转换为 2024/04/16 代码&#xff1a; console.log(item.createTime,切割前);item.createTime item.createTime ? item.createTime.split(T)[0].replace(/-/g, "/") : item.createTime console.log(item.cre…

2024基于PHP开发的微信抖音小程序点餐系统开发源代码案例

最近新开发了一套小程序点餐系统&#xff0c;用户点餐之后可以选择堂食或者是外卖到家&#xff0c;这套系统主要功能有&#xff0c;产品展示&#xff0c;支付系统&#xff0c;外卖配送&#xff0c;用户系统&#xff0c;积分系统&#xff0c;商家管理系统&#xff0c;抽奖系统&a…

第47篇:简易处理器<一>

Q&#xff1a;本期我们开始介绍一种数字系统----简易处理器&#xff0c;可以执行由指令指定的各种操作。 A&#xff1a;简易处理器包含多个9位寄存器、一个数据选择器、一个加/减法器单元和一个控制单元(有限状态机)。 数据选择器&#xff1a;可以将输入数据加载到各种寄存器&…

Docker向harbor上传大镜像的413报错

一、背景 最近遇到了个需求&#xff0c;某厂商的系统模块以容器模式部署在我们的内网环境中&#xff0c;厂商为我们提供了一个公网仓库&#xff0c;需要我们自己下载相关镜像。因此&#xff0c;获取镜像只能通过两种方式&#xff1a; 1.在我们的个人设备上pull镜像&#xff0c…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

网络安全事件频发,让态势感知来提前洞察快速防护

一、引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为社会各界普遍关注的焦点。近年来&#xff0c;网络安全事件频发&#xff0c;给个人、企业乃至国家带来了严重的损失。这些事件不仅揭示了网络安全领域的严峻挑战&#xff0c;也敲响了信息安全…

113 如何排查 cpu 过高的业务进程

前言 又是一个面试问题, 呵呵 之前碰到的 一个 java 进程 cpu 占用率过高, 应该如何排查? 对于这种问题, 第一反应就是 jstack, pstack, 然后仔细观察多次堆栈信息结果的 重复率较高的代码 因此 我给出的思路是, 写脚本 多次 jstack 目标进程, 然后 再统计分析一下 出现频…

请勿假设你的用户都有管理员权限

有些人觉得自己很聪明&#xff0c;他们在程序中做了这样一项”优化”。 在程序的安装阶段&#xff0c;他们不会安装某些程序功能&#xff0c;而是等到用户第一次使用的时候才执行&#xff0c;也即所谓的 “按需加载”。 问题在于&#xff0c;第一次使用的时候&#xff0c;用户…