AI 刷题 10. 永久代币卡回本题解 | 豆包MarsCode AI刷题

58 阅读3分钟

问题背景

小F想要购买一个永久代币卡,价格是 a 勾玉,而每天登录游戏后,她能返还 b 勾玉。她想要知道,至少需要登录多少天才能让她购买的代币卡回本。

回本的意思是:她通过登录返还的勾玉总数,至少能弥补购买代币卡的费用。

问题拆解

我们可以将问题分解为以下几个关键点:

  1. 代币卡价格:代币卡的购买费用是 a 勾玉。
  2. 每日返还:每天登录能返还 b 勾玉。
  3. 目标:找到最小的天数 n,使得她在登录 n 天后,返还的勾玉数目 n * b 至少等于 a,即满足以下条件: n * b ≥ a

数学分析

为了求出最小的天数 n,我们将上述不等式转化为:n ≥ b/a 但是,由于 n 必须是整数,因此我们需要将结果向上取整(即如果计算结果是小数,需要再多加一天)。

数学上,向上取整可以通过 天花板函数(ceil function)来实现。ceil(a / b) 表示将 a / b 向上取整。

示例分析

示例 1:

  • 输入:a = 10, b = 1
  • 每天返还 1 勾玉,10 勾玉需要 10 天才能回本。计算输出:10

示例 2:

  • 输入:a = 10, b = 2
  • 每天返还 2 勾玉,10 勾玉需要 5 天才能回本。计算输出:5

示例 3:

  • 输入:a = 10, b = 3
  • 每天返还 3 勾玉,10 勾玉需要 4 天才能回本。计算输出:4

代码实现

import math

def solution(a: int, b: int) -> int:
    # 计算最少登录的天数,使用向上取整
    return math.ceil(a / b)

if __name__ == '__main__':
    # 测试样例,直接输出结果
    print(solution(10, 1))  # 输出10
    print(solution(10, 2))  # 输出5
    print(solution(10, 3))  # 输出4

代码详解

  1. math.ceil(a / b)

    • a / b 计算出需要多少天才能回本,但由于可能是小数,math.ceil() 将它向上取整,使得最少的整数天数满足条件 n * b >= a
    • 例如,若 a = 10b = 3,则 10 / 3 = 3.33,用 ceil(3.33) 会返回 4,表示需要 4 天。
  2. 测试用例

    • if __name__ == '__main__' 块中,写了三个测试用例来验证代码的正确性:

      • solution(10, 1) 返回 10:每天返还 1 勾玉,需要 10 天。
      • solution(10, 2) 返回 5:每天返还 2 勾玉,需要 5 天。
      • solution(10, 3) 返回 4:每天返还 3 勾玉,需要 4 天。

时间复杂度分析

  • 由于 math.ceil 函数和除法运算的时间复杂度是常数时间 O(1),因此整个算法的时间复杂度是 O(1)
  • 代码中只有一行核心的计算,没有循环或者递归,整体非常高效。

空间复杂度分析

  • 由于算法仅使用了常数空间来存储输入和计算结果,空间复杂度也是 O(1)

图解

为了帮助更好地理解,现在尝试通过图解来展示每个案例中的天数计算。

示例 1:a = 10, b = 1

|--------------------------------------|  
| Day 1 | Day 2 | Day 3 | ... | Day 10 |
|   1   |   2   |   3   | ... |   10  |
|--------------------------------------|
  • 经过 10 天,累计返还勾玉 10,回本。

示例 2:a = 10, b = 2

plaintext
复制代码
|------------------------|
| Day 1 | Day 2 | Day 3 | ... | Day 5 |
|   2   |   4   |   6   | ... |   10 |
|------------------------|
  • 经过 5 天,累计返还勾玉 10,回本。

示例 3:a = 10, b = 3

plaintext
复制代码
|----------------------|
| Day 1 | Day 2 | Day 3 | Day 4 |
|   3   |   6   |   9   |  12  |
|----------------------|
  • 经过 4 天,累计返还勾玉 12,回本。

总结

这个问题的关键是如何通过数学公式计算最小的天数,确保返还的勾玉总数满足条件。通过向上取整计算 a / b,最后得到了正确的天数。

通过简单的数学推导与 Python 的内建函数 math.ceil() 高效解决了问题,时间复杂度为 O(1) ,非常高效。