259. 数值操作的期望计算问题 | 豆包MarsCode AI刷题

115 阅读2分钟

题目思路讲解

假设我们有两个正整数 𝑎a 和 𝑏b。题目要求我们对这两个数进行两次独立的随机操作,每次操作以等概率(即 1221​)选择其中一个数并将其值翻倍。我们需要计算经过这两次操作后,𝑎a 和 𝑏b 之和的期望值。

分析过程

  1. 单次操作的期望值

    • 每次操作都有 1221​ 的概率选择 𝑎a 或 𝑏b 并将其翻倍。

    • 因此,单次操作后 𝑎a 和 𝑏b 的期望值分别为:

      • 𝐸(𝑎)=12𝑎+12(2𝑎)=32𝑎E(a)=21​a+21​(2a)=23​a
      • 𝐸(𝑏)=12𝑏+12(2𝑏)=32𝑏E(b)=21​b+21​(2b)=23​b
  2. 两次操作的期望值

    • 由于每次操作是独立的,两次操作后的期望值可以通过将单次操作的期望值相乘得到。

    • 两次操作后 𝑎a 和 𝑏b 的期望值分别为:

      • 𝐸(𝑎)=(32)2𝑎=94𝑎E(a)=(23​)2a=49​a
      • 𝐸(𝑏)=(32)2𝑏=94𝑏E(b)=(23​)2b=49​b
  3. 总和的期望值

    • 经过两次操作后,𝑎a 和 𝑏b 之和的期望值为:

      • 𝐸(𝑎+𝑏)=𝐸(𝑎)+𝐸(𝑏)=94𝑎+94𝑏=94(𝑎+𝑏)E(a+b)=E(a)+E(b)=49​a+49​b=49​(a+b)

代码分析

Python
深色版本
def solution(a: int, b: int) -> str:
    # 计算期望值
    E = (9 * (a + b)) / 4
    # 将期望值格式化为保留两位小数的字符串
    return f"{E:.2f}"

if __name__ == '__main__':
    # 测试用例
    print(solution(3, 3) == '13.50')  # 应输出 True
    print(solution(5, 7) == '27.00')  # 应输出 True
    print(solution(1, 1) == '4.50')   # 应输出 True

代码解释

  1. 函数定义

    • solution(a: int, b: int) -> str: 定义了一个函数 solution,接受两个整数参数 a 和 b,并返回一个字符串。
  2. 计算期望值

    • E = (9 * (a + b)) / 4: 根据前面的分析,计算 𝑎a 和 𝑏b 之和的期望值。
    • return f"{E:.2f}": 使用 f-string 将期望值格式化为保留两位小数的字符串。
  3. 测试用例

    • print(solution(3, 3) == '13.50'): 测试当 𝑎=3a=3 和 𝑏=3b=3 时,期望值是否为 13.50。
    • print(solution(5, 7) == '27.00'): 测试当 𝑎=5a=5 和 𝑏=7b=7 时,期望值是否为 27.00。
    • print(solution(1, 1) == '4.50'): 测试当 𝑎=1a=1 和 𝑏=1b=1 时,期望值是否为 4.50。