P9586 「MXOI Round 2」游戏

📅 发布时间:2026/7/10 15:06:47 👁️ 浏览次数:
P9586 「MXOI Round 2」游戏
记录71#includebits/stdc.h using namespace std; int main(){ int t,c1,c2,c3,d1,d2,d3; cint; while(t--){ int x0; cinc1c2c3d1d2d3; if(c1d2||c3d1) x1; if(x1){ coutCendl; continue; } d1-c3; if(d1c2||d3c1) x2; if(x2){ coutDendl; continue; } if(x0) coutEendl; } return 0; }题目传送门https://www.luogu.com.cn/problem/P9586突破口杀对对方使用对方需要使用一张闪否则对方输掉游戏或回应对方的斩闪回应对方的杀斩对对方使用对方需要使用一张杀否则对方输掉游戏。从小 C 开始小 C 共有 c1​ 张杀、c2​ 张闪、c3​ 张斩小 D 共有 d1​ 张杀、d2​ 张闪、d3​ 张斩双方都知道对方的手牌。你需要求出双方在都进行最优策略的情况下游戏的结果会如何。思路小 C 先手能否直接获胜 杀赢 或 斩赢如果小 C 不能先手赢轮到小 D 反击 杀赢 或 斩赢平局代码简析读入测试数据组数t。c1, c2, c3小 C 的杀、闪、斩数量。d1, d2, d3小 D 的杀、闪、斩数量。while(t--){ int x 0; cin c1 c2 c3 d1 d2 d3;对每组数据初始化结果标志x 00 表示尚未分出胜负可能平局。 第一步小 C 先手能否直接获胜if(c1 d2 || c3 d1) x 1; 分析小 C 在第一回合可以出最多c1张杀→ 小 D 需要至少c1张闪d2来全部抵消最多c3张斩→ 小 D 需要至少c3张杀d1来全部抵消如果c1 d2小 D 的闪不够挡所有“杀” → 小 C 出d21张杀小 D 无法全挡 →小 C 赢如果c3 d1小 D 的杀不够挡所有“斩” → 小 C 出d11张斩小 D 无法全挡 →小 C 赢✅ 所以只要满足任一条件小 C先手必胜。if(x 1){ cout C endl; continue; }如果x 1输出C跳过后续逻辑。 第二步如果小 C 不能先手赢轮到小 D 反击d1 - c3; 为什么减c3小 C 虽然不能直接赢但会最优出牌。由于c3 d1否则上一步已赢小 C 一定会出全部c3张斩因为不出浪费且对己无害。小 D 必须用c3张杀来抵消这些斩 → 所以小 D 剩下的杀为d1 - c3✅ 这是双方最优策略下的必然消耗。if(d1 c2 || d3 c1) x 2; 现在轮到小 D 的回合第二回合他能否反杀小 D 此时可以出杀最多d1已减去用于挡斩的部分斩最多d3小 C 需要用闪c2挡小 D 的杀用杀c1挡小 D 的斩所以如果d1 c2小 D 出c21张杀小 C 闪不够 →小 D 赢如果d3 c1小 D 出c11张斩小 C 杀不够 →小 D 赢✅ 满足任一小 D 在第二回合必胜。if(x 2){ cout D endl; continue; }输出D结束本组。 第三步双方都无法在前两回合取胜 → 平局if(x 0) cout E endl; 为什么是平局小 C 先手无法赢c1 ≤ d2且c3 ≤ d1小 D 反击也无法赢d1 - c3 ≤ c2且d3 ≤ c1此时小 C 出完所有斩c3小 D 用c3张杀挡掉小 D 出完所有斩d3小 C 用d3张杀挡掉剩余的杀/闪也足够互相抵消➡️ 双方进入“互相有解”的状态谁也不敢贸然出牌因为出多少都能被挡于是都不出牌游戏无限进行 → 平局题目中“平局”定义为“谁也无法获胜”符合此情况。✅ 总结博弈逻辑链阶段条件结果小 C 先手c1 d2或c3 d1C 赢小 D 反击(d1 - c3) c2或d3 c1D 赢否则所有攻击都能被防御平局E补充在 CSP尤其是 CSP-J/S 初赛和复赛 中像“小 C 和小 D 打牌”这类博弈模拟 最优策略判断的题目非常典型。它们看似复杂但其实有清晰的解题套路和技巧。下面为你系统总结这类题在 CSP 中的 核心思想、常见模型与应试技巧✅ 一、题型识别这是什么题这类题通常具有以下特征两人轮流操作A 先手B 后手双方信息完全公开知道对方所有状态每一步操作有明确规则和代价目标是判断先手胜 / 后手胜 / 平局强调“最优策略”即双方都尽可能让自己赢、阻止对方赢 这类题不是搜索或 DP而是 逻辑推理 贪心模拟✅ 二、核心解题思路CSP 高频套路 技巧 1分阶段分析回合CSP 的博弈题通常只涉及 前 1~2 个回合 就能决定胜负因为如果先手能在第一回合直接获胜 → 先手必胜如果不能后手是否能在第二回合反杀如果都不能 → 双方进入“互相有解”状态 → 平局 CSP 不考复杂博弈论如 SG 函数只考 有限步内的必胜/必败判断 技巧 2“最大压力测试”思维先手会 尽可能出最多的攻击牌比如全部“杀”“斩”判断对方 防御资源是否足够杀 ←→ 闪斩 ←→ 杀如果防不住 → 赢如果防得住 → 进入下一阶段 技巧 3资源消耗要更新第一回合结束后防御方的资源会被消耗例如C 出了 c3 张斩 → D 必须用 c3 张杀来挡 → D 剩余杀 d1 - c3第二回合要用剩余资源判断是否能反杀 技巧 4平局 双方都无法突破当且仅当先手攻不破后手防御后手也攻不破先手防御此时理性玩家会选择 不出牌避免浪费游戏无限循环 → 平局✅ 三、CSP 常见博弈模型背下来表格模型 特点 解法卡牌对攻型本题 杀/闪/斩互克 分两回合模拟资源消耗取石子类 每次取 1~k 个最后取光者胜 判断 n % (k1)巴什博弈分糖果/分物品 两人轮流选最大化自己 贪心 or 简单 DP位置移动型 在数轴上移动谁先到终点赢 判断距离奇偶性 or 步数⚠️ 注意CSP-J/S 几乎不考 Nim 博弈、SG 函数等高级内容重点是 逻辑清晰 模拟准确✅ 四、代码实现技巧CSP 编程题用标志变量记录胜负状态如 x0/1/2顺序判断cpp编辑if (先手能赢) → 输出 Celse if (后手能赢) → 输出 Delse → 输出 E注意资源更新顺序先消耗再判断不要写递归/搜索CSP 数据小但逻辑要快直接 if-else 模拟✅ 五、避坑指南CSP 高频错误表格错误 正确做法忘记先手必须先出牌 先判断 C 能否第一回合赢没更新 D 的剩余杀d1 - c3 必须扣除用于挡斩的杀认为“可以留牌”就有优势 最优策略下能出就出不留无用牌混淆“杀”和“斩”的应对关系 杀 ← 闪斩 ← 杀死记✅ 六、一句话口诀考前背诵“先手猛攻看防住后手反杀算余力攻防皆稳无人输平局就是 E 结局。”✅ 总结在 CSP 中遇到此类博弈题记住不是搜索是逻辑推理只看前 1~2 回合模拟资源消耗 最大压力测试三结果C / D / E按顺序判断掌握这套方法这类题就是送分题祝你在 CSP 中轻松拿下这类题目