1686. 石子游戏 VI

目录

Alice 和 Bob 的石子游戏 — 多维价值博弈问题详解

题目描述

题目分析

解题思路

关键点

为什么按总价值排序?

具体方法

代码实现(Python)

复杂度分析

示例说明

小结


Alice 和 Bob 的石子游戏 — 多维价值博弈问题详解

题目描述

Alice 和 Bob 有一堆石子,共计 n 个。两人轮流从这堆石子中取出一个石子,Alice 先手。

每个石子对 Alice 和 Bob 来说,价值不同。具体来说,用两个长度为 n 的数组表示这堆石子:

  • aliceValues[i] 表示第 i 个石子对 Alice 的价值。
  • bobValues[i] 表示第 i 个石子对 Bob 的价值。

游戏进行时,轮到某人取石子时,他(她)从剩余石子中拿走一个,并获得对应于自己的价值积分。两人都知道对方的价值判断标准,且都采用 最优策略

游戏结束后(所有石子被取完),得分较高者获胜,若得分相同,则为平局。

请你根据 aliceValuesbobValues,判断游戏最终结果:

  • 如果 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分。

双方会权衡争夺最大“总价值”的石子,因为那代表“分数差”最大。


具体方法

  1. 计算所有石子总价值
    对每个石子 i,计算 aliceValues[i] + bobValues[i]
  2. 将石子按总价值从大到小排序
    形成一个新的石子顺序。
  3. 轮流选择石子
    • Alice 先选,取第一个石子,得分加 aliceValues[i]
    • Bob 选第二个石子,得分加 bobValues[i]
    • 依次类推,轮流取石子。
  1. 计算最终得分差
    • 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(平局)


小结

  • 这道题的难点在于两人价值不同且相互知道对方的评分标准。
  • 解决方案基于双方理性、最优策略选择,采用了“石子综合价值排序”的贪心思想。
  • 按总价值排序确保双方优先争夺对双方都有较大影响的石子,从而实现最优策略。
  • 最后计算两人得分差即可判断胜负。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值