本篇文章实为分享:

A 和 B 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。

规则:

1.A 和 B轮流进行自己的回合,A先手。

2.每一回合,玩家需要从 stones 中移除任一石子。

3.如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏 。
        4.如果不满足上一条,且移除后没有任何剩余的石子,那么 B 将会直接获胜(即便是在 A的回合)。
假设两位玩家均采用 最佳 决策。如果 A 获胜,返回 true ;如果 B获胜,返回 false 。

分析:

思路与算法

由于玩家的目标是使得已经被移除的石子的价值总和不是 3 的倍数,因此我们可以把石子分成三类,它们的价值除以 3 的余数分别为 0, 1, 2。我们可以直接用 0, 1, 2 代表它们的价值,对应的石子数量分别为cnt0,cnt1,cnt2

可以发现,移除类型 0的石子并不会对总和产生影响,因此类型 0 的石子可以看成是「先后手」交换。具体地,例如当前是 A 在进行操作,它发现如果自己选择移除类型 1 或 2 的石子,那么她在最后一定不能获胜。这时它就可以选择移除一个类型 0 的石子,将同样的局面交给 B。如果类型 0 的石子还没有移除完,那么 B 同样可以通过移除一个类型 0 的石子将局面重新交给 A。这样不断地往复下去,我们可以得到结论:

如果类型 0 的石子的个数为偶数,那么胜负情况等价于没有类型 0 的石子的胜负情况;

如果类型 0 的石子个数为奇数,那么胜负情况等价于只有 1 个类型 0 的石子的胜负情况。注意这里不能单纯地等价于「没有类型 0 的石子的胜负情况」的相反情况,这是因为如果所有的石子都被移除完,无论谁移除了最后一个石子,都算 A 输。因此如果 A 发现自己选择移除类型 1 或 2 的石子不能获胜,于是选择移除类型 0 的石子,并且它不能获胜的原因是「石子会移除完」,那么 A 仍然会输。

将类型 0 的石子考虑完全之后,我们就还剩下类型 1 和 2 的石子了。可以发现,为了保证移除石子的和不为 3 的倍数,操作顺序只有可能为下面的两种情况:

如果 A 首先移除类型 1 的石子,那么 B 只能移除类型 1 的石子,在这之后 A 只能移除类型 2 的石子,B 同样只能移除类型 1 的石子。以此类推,移除石子的类型序列为:
1121212121⋯

如果 A 首先移除类型 22 的石子,我们可以类似得到移除石子的类型序列为:
2212121212⋯

作为先手的 A 可以在二者中选择一个序列。例如 A 选择第一种,那么 B 永远移除类型 1 的石子,A 除了第一步移除类型 1 的石子之外,后续永远移除类型 2 的石子。因此 A 可以获胜当且仅当:

类型 1 的石子恰好有 1 个,并且类型 2 的石子至少有 1 个。此时 A 在 B 完成第一步时获胜;

类型 1 的石子至少有 2 个,并且不能比类型 2 的石子多:

如果多 1 个,那么在 A 移除最后一个类型 2 的石子后,所有的石子都被移除,B 获胜;

如果多 2 个,那么在 B 移除最后一个类型 1 的石子后,所有的石子都被移除,B 获胜;

如果多超过 2 个,那么 A 会在某一步没有类型 2 的石子可以移除,B 获胜;

如果一样多或类型 2 的石子更多,那么 B 会在某一步没有类型 1 的石子可以移除,A 获胜。

上面的两个条件可以归纳为同一个条件,即有类型 1 的石子,并且不能比类型 2 的石子多。

同理,如果 A 选择第二种,那么她获胜当且仅当有类型 2 的石子,并且不能比类型 1 的石子多。

上述的两种情况也可以归纳为同一种情况,即类型 1 和类型 2 的石子至少都有 1 个。

细节

回到前面关于类型 0 石子的讨论,可以得到 A 获胜的条件:

如果类型 0 的石子的个数为偶数,那么 A 获胜当且仅当类型 1 和类型 2 的石子至少都有 1 个;

如果类型 0 的石子的个数为奇数,那么 A获胜当且仅当「在没有类型 0 石子的情况下,B 获胜且原因不是因为所有石子都被移除」。对应到上面的分析即为「类型 1 的石子比类型 2 多超过 2 个」或者「类型 2 的石子比类型 1 多超过 2 个」。

class Solution:def stoneGameIX(self, stones):""":type stones: List[int]:rtype: bool"""cnt0 = cnt1 = cnt2 = 0for val in stones:if (typ := val % 3) == 0:cnt0 += 1elif typ == 1:cnt1 += 1else:cnt2 += 1if cnt0 % 2 == 0:return cnt1 >= 1 and cnt2 >= 1return cnt1 - cnt2 > 2 or cnt2 - cnt1 > 2

来源:
https://leetcode-cn.com/problems/stone-game-ix

石子游戏:移除石子价值总和能被三整除则输相关推荐

  1. 【数据结构与算法】之深入解析“石子游戏IX”的求解思路与算法示例

    一.题目描述 Alice 和 Bob 再次设计了一款新的石子游戏,现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值,给你一个整数数组 stones ,其中 stones[i] 是第 i 个 ...

  2. 2029. 石子游戏 IX

    2029. 石子游戏 IX Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] ...

  3. 2029.石子游戏 IX-LeetCode

    难度:中等 目录 一.问题描述 二.解题思想 三.解题 1.判断极端情况 2.代码实现 一.问题描述 这里我直接采用的LeetCode上面的问题描述. Alice 和 Bob 再次设计了一款新的石子游 ...

  4. 2029. 石子游戏 IX(C++解法与思路)

    题目: Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的 ...

  5. 【博弈论】leetcode2029. 石子游戏 IX

    题目: Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的 ...

  6. 博弈论之取石子游戏的学习

    以下内容来自转载: 博弈问题简介 所讨论的博弈问题满足以下条件: 玩家只有两个人,轮流做出决策 游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输 对任何一种局面,胜负只决定于局 ...

  7. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  8. bzoj1874: [BeiJing2009 WinterCamp]取石子游戏

    1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 834  Solved: 350 ...

  9. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

最新文章

  1. apache mahout_使用Apache Mahout创建在线推荐系统
  2. nginx缓存HtmL文件,Nginx在缓存的html文件上返回404
  3. 在服务器上远程使用tensorboard查看训练loss和准确率
  4. sql order by 结合case when then
  5. [李景山php]每天TP5-20170125|thinkphp5-Process.php-7
  6. docker容器使用-图解
  7. python中rawinput用法_Python 中 input()用法 以及与raw_input() 的区别
  8. python pywinauto 自动控制微信, 关键字回复、收款、定时任务, 代替人工成为微信客服
  9. 华为笔试题 2022.3.30
  10. 免费申请国外免费域名超详细教程
  11. 从游戏中学习产品设计04:成就篇
  12. EasyExcel ExcelGenerateException: The index of ‘xx‘ and ‘xx‘ must be inconsistent
  13. ts16949 软件开发流程图_TS16949体系过程流程图(1)
  14. 第29题:link与@import的区别
  15. TIA博途WINCC的触摸屏VB脚本入门学习(IF THEN ELSE判断语句)
  16. 愚人节的希腊神话传说
  17. 十五数码难题 A*算法及深度优先算法实现
  18. html页面内容分页【转】
  19. Bounding Volume Hierarchy (BVH)
  20. 为什么程序下在其他盘,c盘空间还是增多了?appdata文件夹有什么用途?

热门文章

  1. Vue开发实例(14)之Vue状态管理store
  2. Parse算法学习笔记
  3. 案例分享:某品牌音响系列协议调试工具(搜寻主机,查询通道,基本控制API,云音乐API,语言节目API等,可增删改指令)
  4. 企业如何突破瓶颈期的产品营销困境——全民拼购,不伤人脉的营销
  5. CSAPP——Hello程序的一生
  6. Halcon python接口
  7. 九寨沟游玩体会-03-旅程
  8. [附源码]JSP+ssm计算机毕业设计危化品信息管理系e35rn【源码、数据库、LW、部署】
  9. python入门教程小学生_Python快速入门!为什么小学生都能学会Python,附python教程...
  10. 第70届(2019)IMO中国国家队选拔考试试题