当前位置: 首页 > news >正文

(AcWing)集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S。

现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S,最后无法进行操作的人视为失败。

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

输入格式

第一行包含整数 k,表示数字集合 S 中数字的个数。

第二行包含 k 个整数,其中第 i 个整数表示数字集合 S 中的第 i 个数 si。

第三行包含整数 n。

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

输出格式

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

否则,输出 No

数据范围

1≤n,k≤100,
1≤si,hi≤10000

输入样例:

2
2 5
3
2 4 7

输出样例:

Yes
#include<iostream>
#include<algorithm>
#include<unordered_set>
#include<cstring>
using namespace std;const int N = 110, M = 10010;int s[N],f[M];  //s用来存储数字集合,f用来存储各状态的sg
int n,m;int sg(int num)
{//如果当前这个数的sg不为-1,说明已被计算过,则直接返回if(f[num]!=-1) return f[num];//定义哈希表,防止出现重复的数字unordered_set<int> S;//对该堆石子进行判断,是否可以拿取集合内的数量的石子,若可以,则将拿去后的状态进行sg(即剩余石子的数量)for(int i=0;i<n;i++) if(num>=s[i]) S.insert(sg(num-s[i]));//对哈希表进行查找,每次将不存在集合中的最小的自然数赋予f[num](即Mex运算),并返回f[num];for(int i=0; ;i++) if(!S.count(i)) return f[num] = i;
}int main()
{cin>>n;for(int i=0;i<n;i++) cin>>s[i];memset(f,-1,sizeof f);  //初始化f数组,每个值均为-1int res = 0;cin>>m;//若起点的sg(即初始石子堆的sg)均不为0,则先手必胜//设终点的sg为0,若起点的sg不为0,则可以进行一系列的操作后到0,在这一系列操作中有到0的,有不到0的,不到0的就是获胜的操作//若起点为0,0是最小的自然数,由Mex运算可知,0无法通过任何操作变成非零数,即这就是先手必败for(int i=0;i<m;i++){int num;cin>>num;res^=sg(num);}if(res) cout<<"Yes"<<endl;else cout<<"No"<<endl;return 0;
}

 

http://www.lryc.cn/news/102471.html

相关文章:

  • ConcurrentHashMap源码详解
  • 医疗流程自动化盛行,RPA成为医疗保健行业的重点应用技术
  • Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单
  • java重试机制实现方案
  • 参数量仅有50KB的超轻量级unet变种网络egeunet【参数和计算量降低494和160倍】医疗图像分割实践
  • Android10 Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项
  • 51单片机——串行口通信
  • 洛谷题单 Part 6.7.1 矩阵
  • Spring中c3p0与dbcp配置
  • Flutter 添加 example流程
  • 数据治理8种方法
  • 大模型成互联网真正蜕变的标志,亦是各种新技术开始衍生的标志
  • 指针进阶详解---C语言
  • 设计模式思考,简单工厂模式和策略模式的区别?
  • Java - sh 脚本启动 jar 包等服务 - sh 脚本模板 - 适用于任何类似的服务启动
  • MySQL高级篇第5章(存储引擎)
  • openssl 命令行国密sm2的签名验签操作
  • 开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)
  • 为 Google Play 即将推出基于区块链的内容政策做好准备
  • 查找-多路查找详解篇
  • css设置八等分圆
  • 「教程」如何使用一套代码在多种程序中接入天气预警API
  • (MYSQL)数据库服务端的启动与停止,登录与退出
  • 数学建模学习(8):单目标和多目标规划
  • 【Vscode | R | Win】R Markdown转html记录-Win
  • 【Lua语法】字符串操作、字符串中的方法
  • Linux 终端生成二维码
  • 子组件未抛出事件 父组件如何通过$refs监听子组件中数据的变化
  • 【C++】STL——stack的介绍和使用、stack的push和pop函数介绍和使用、stack的其他成员函数
  • 基于BIM+AI的建筑能源优化模型【神经网络】