目录
Alice 和 Bob 的石子游戏 — 多维价值博弈问题详解
Alice 和 Bob 的石子游戏 — 多维价值博弈问题详解
题目描述
Alice 和 Bob 有一堆石子,共计 n 个。两人轮流从这堆石子中取出一个石子,Alice 先手。
每个石子对 Alice 和 Bob 来说,价值不同。具体来说,用两个长度为 n 的数组表示这堆石子:
aliceValues[i]表示第i个石子对 Alice 的价值。bobValues[i]表示第i个石子对 Bob 的价值。
游戏进行时,轮到某人取石子时,他(她)从剩余石子中拿走一个,并获得对应于自己的价值积分。两人都知道对方的价值判断标准,且都采用 最优策略。
游戏结束后(所有石子被取完),得分较高者获胜,若得分相同,则为平局。
请你根据 aliceValues 和 bobValues,判断游戏最终结果:
- 如果 Alice 获胜,返回
1。 - 如果 Bob 获胜,返回
-1。 - 如果平局,返回
0。
题目分析
这道题表面看似普通的“轮流取石子”,但复杂之处在于:
- 两人的评判标准不同,同一个石子对双方价值不同。
- 两人均知道彼此的价值评判,且都用最优策略。
- 取石子顺序会影响双方最终得分,双方都会争夺高价值石子。
因此,这不是简单的贪心取最大价值的问题,而是需要考虑双方对石子的综合价值以及对方的策略。
解题思路
关键点
- 玩家轮流取石子,石子被取走后消失。
- 由于双方知道对方价值且都理性最优,会优先抢夺双方综合价值高的石子。
- 对双方来说,“总价值”是
aliceValues[i] + bobValues[i]。 - 按照这个总价值排序石子,是双方争夺的核心。
为什么按总价值排序?
假设有两个石子:
- 石子A:Alice值10,Bob值5,总和15。
- 石子B:Alice值3,Bob值12,总和15。
两个石子总价值相同,但 Alice 和 Bob 对两者偏好不同。
如果先取石子A,Alice得10分,Bob放弃了5分。
如果先取石子B,Bob得12分,Alice放弃了3分。
双方会权衡争夺最大“总价值”的石子,因为那代表“分数差”最大。
具体方法
- 计算所有石子总价值
对每个石子i,计算aliceValues[i] + bobValues[i]。 - 将石子按总价值从大到小排序
形成一个新的石子顺序。 - 轮流选择石子
-
- Alice 先选,取第一个石子,得分加
aliceValues[i]。 - Bob 选第二个石子,得分加
bobValues[i]。 - 依次类推,轮流取石子。
- Alice 先选,取第一个石子,得分加
- 计算最终得分差
-
- Alice 和 Bob 的总分相比较。
- Alice 得分高返回
1,Bob 得分高返回-1,平局返回0。
代码实现(Python)
from typing import List
class Solution:
def stoneGameVI(self, aliceValues: List[int], bobValues: List[int]) -> int:
n = len(aliceValues)
# 按照 aliceValues[i] + bobValues[i] 降序排序,得到石子的选择顺序
stones = sorted(range(n), key=lambda i: aliceValues[i] + bobValues[i], reverse=True)
alice_score, bob_score = 0, 0
# 轮流选择石子
for i, stone in enumerate(stones):
if i % 2 == 0: # Alice 轮
alice_score += aliceValues[stone]
else: # Bob 轮
bob_score += bobValues[stone]
if alice_score > bob_score:
return 1
elif alice_score < bob_score:
return -1
else:
return 0
复杂度分析
- 排序复杂度为
O(n log n),其中n是石子数量。 - 遍历石子累计得分是
O(n)。 - 总体复杂度为
O(n log n),适合大规模输入。
示例说明
示例1:
aliceValues = [1, 3]
bobValues = [2, 1]
- 石子0总价值 = 1 + 2 = 3
- 石子1总价值 = 3 + 1 = 4
排序后顺序:石子1 (4), 石子0 (3)
- Alice先拿石子1,得分 3
- Bob拿石子0,得分 2
结果:Alice 3 vs Bob 2,返回 1(Alice胜)
示例2:
aliceValues = [1, 2]
bobValues = [3, 1]
- 石子0总价值 = 1 + 3 = 4
- 石子1总价值 = 2 + 1 = 3
排序后顺序:石子0 (4), 石子1 (3)
- Alice先拿石子0,得分 1
- Bob拿石子1,得分 1
结果:Alice 1 vs Bob 1,返回 0(平局)
小结
- 这道题的难点在于两人价值不同且相互知道对方的评分标准。
- 解决方案基于双方理性、最优策略选择,采用了“石子综合价值排序”的贪心思想。
- 按总价值排序确保双方优先争夺对双方都有较大影响的石子,从而实现最优策略。
- 最后计算两人得分差即可判断胜负。
300

被折叠的 条评论
为什么被折叠?



