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

题解:AcWing 894 拆分-Nim游戏

【题目来源】

AcWing:894. 拆分-Nim游戏 - AcWing题库

【题目描述】

给定 \(n\) 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆规模更小的石子(新堆规模可以为 \(0\),且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。

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

【输入】

第一行包含整数 \(n\)

第二行包含 \(n\) 个整数,其中第 \(i\) 个整数表示第 \(i\) 堆石子的数量 \(a_i\)

【输出】

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

否则,输出 No

【输入样例】

2
2 3

【输出样例】

Yes

【算法标签】

《AcWing 894 拆分-Nim游戏》 #数学知识# #博弈论# #SG函数#

【代码详解】

#include <bits/stdc++.h>
#include <unordered_set>
using namespace std;const int N = 105;  // 最大石子数
int f[N];          // 记忆化SG函数值,f[x]表示有x个石子的SG值// 计算有x个石子的SG函数值
int sg(int x)
{// 如果已经计算过,直接返回记忆化的值if (f[x] != -1){return f[x];}// 存储所有可能分裂后状态的SG值的异或和unordered_set<int> S;// 遍历所有可能的拆分方式// 将x个石子拆分成两堆:一堆i个,一堆j个// 其中 i + j < x(至少剩下1个石子用于拆分)for (int i = 0; i < x; i++)        // 第一堆的大小,0 ≤ i < x{for (int j = 0; j <= i; j++)   // 第二堆的大小,0 ≤ j ≤ i{// 拆分成两堆(i,j)后,形成两个独立的游戏// 组合游戏的SG值是两个独立游戏SG值的异或S.insert(sg(i) ^ sg(j));}}// mex操作:找到最小的不在集合S中的非负整数for (int i = 0; ; i++){if (!S.count(i))  // 如果i不在集合S中{return f[x] = i;  // 记忆化并返回SG值}}
}int main()
{int n;  // 石子堆数cin >> n;// 初始化SG函数记忆化数组为-1(表示未计算)memset(f, -1, sizeof(f));int res = 0;  // 所有石子堆SG值的异或和// 输入每堆的石子数,并计算SG值的异或和for (int i = 0; i < n; i++){int x;  // 当前堆的石子数cin >> x;res ^= sg(x);  // 计算当前堆的SG值并异或}// 根据SG定理判断胜负:// 如果所有石子堆SG值的异或和不为0,先手必胜// 如果所有石子堆SG值的异或和为0,先手必败if (res){cout << "Yes" << endl;  // 先手必胜}else{cout << "No" << endl;   // 先手必败}return 0;
}

【运行结果】

2
2 3
Yes
http://www.jsqmd.com/news/409966/

相关文章:

  • 题解:AcWing 892 台阶-Nim游戏
  • Photoroom 2026.08.04 | 法国大厂出品,高质量无限AI生图,最强电商作图
  • 随心听书 2.0.2 | 电子书听书神器,内置微软语音,堪比真人
  • stm32死锁是怎么实现的
  • stm32最级别的烧录解锁是什么?
  • Agentic AI:自主决策的新范式
  • 2026优质的汽车涂装废水处理企业推荐 - 品牌排行榜
  • 2026哪个品牌的袋式过滤器好?行业口碑推荐 - 品牌排行榜
  • Microsoft Agent Framework 取出 DeepSeek 思考内容
  • 从基础到实战:Java全栈开发工程师的面试实录
  • 服务效率提升实战:排队理论与多场景仿真案例
  • 安装开发环境
  • 深入解析Stable Diffusion核心组件:超越基础文本到图像的内部机制
  • 避免在 onbind 方法调用 getCallingUid 与 getCallingPid 方法
  • 好用的skills清单
  • 在 Android Studio 中,新建 AIDL 文件按钮是灰色
  • Android 开发问题:The direction of ‘data‘ is not specified. array can be an in, out, or inout parameter.
  • Android 多进程开发 - AIDL 回调、RemoteCallbackList、AIDL 安全校验
  • 为什么 Controller 层坚决不能直接调 DAO 层?
  • Redis 的 ZipList 是什么?它是怎么解决内存碎片问题的?
  • 小遥搜索v1.2.0版本更新【已支持-语雀数据源集成】
  • 梦笔记20260225
  • 2026年智能系统门窗公司综合评估:五大品牌实力对比 - 2026年企业推荐榜
  • 2026年河南氧系漂白剂直销公司综合评估与精选推荐 - 2026年企业推荐榜
  • 2026年静音系统门窗诚信服务商综合评测与选购指南 - 2026年企业推荐榜
  • 2026年河南道闸广告平台深度盘点与选择指南 - 2026年企业推荐榜
  • 2026年实力MBBR填料厂商盘点与选型指南 - 2026年企业推荐榜
  • 移动硬盘被system占用无法弹出
  • 2026年河南过氧碳酸钠采购指南:五大优质供应商深度解析 - 2026年企业推荐榜
  • 2026年河南灯光秀广告公司选购指南:实力品牌深度解析 - 2026年企业推荐榜