小C的糖果分配问题解析 | 豆包MarsCode AI刷题

188 阅读4分钟

这个问题要求我们在满足每个小朋友分到的糖果数量必须在 lr 之间的前提下,计算最少和最多可以分给多少个小朋友。我们还需要判断是否能够正好分完所有糖果,如果不能正好分配糖果,返回 -1

关键思路

  1. 最少小朋友数量

    • 每个小朋友最多分 r 颗糖果。如果要分 n 颗糖果,最少需要多少个小朋友呢?
      可以通过 min_friends = math.ceil(n / r) 来计算。因为如果每个小朋友分 r 颗糖果,math.ceil(n / r) 就是最少需要的小朋友数。
  2. 最多小朋友数量

    • 每个小朋友最少分 l 颗糖果。如果要分 n 颗糖果,最多需要多少个小朋友呢?
      可以通过 max_friends = n // l 来计算。因为如果每个小朋友分 l 颗糖果,n // l 就是最多可以分给的小朋友数。
  3. 检查是否能够正好分完糖果

    • 我们需要检查是否可以将 n 颗糖果分配给满足条件的小朋友数量。如果我们将糖果分给 min_friends 和 max_friends 个小朋友,是否能正好分完糖果?

    1. 如果 min_friends * l > n,说明即使每个小朋友最少分 l 颗糖果,所需的糖果数也已经超过 n,所以无法分配。
    2. 如果 max_friends * r < n,说明即使每个小朋友最多分 r 颗糖果,糖果数也不足以分配给 max_friends 个小朋友,所以也无法分配。
  4. 返回结果

    • 如果满足分配条件,就返回 [min_friends, max_friends];否则返回 -1。import math

def solution(n: int, l: int, r: int) -> list: # 计算最少和最多小朋友数量 min_friends = math.ceil(n / r) max_friends = n // l

# 检查是否可以正好分配糖果
if min_friends * l > n or max_friends * r < n:
    return [-1]

return [min_friends, max_friends]

测试代码:

if name == 'main': print(solution(10, 2, 3)) # 输出 [4, 5] print(solution(7, 3, 5)) # 输出 [2, 2] print(solution(8, 1, 4)) # 输出 [2, 8]### 代码解释

  1. min_friends = math.ceil(n / r)

    • 使用 math.ceil 计算最少的小朋友数,因为如果每个小朋友分 r 颗糖果,就可能有剩余的糖果。我们需要 math.ceil 来向上取整,确保每个小朋友都可以分到糖果。
  2. max_friends = n // l

    • 使用整数除法 // 计算最多的小朋友数,因为如果每个小朋友分 l 颗糖果,我们可以分配到的最多小朋友数就是 n // l
  3. 检查是否可以正好分完糖果

    • min_friends * l > n 表示最少的小朋友数如果每人分 l 颗糖果就不够分配糖果。
    • max_friends * r < n 表示最多的小朋友数如果每人分 r 颗糖果就无法分完所有糖果。
  4. 返回值

    • 如果可以分配糖果,则返回 [min_friends, max_friends],否则返回 [-1]

测试样例分析

示例 1

输入:n = 10, l = 2, r = 3

  • 最少小朋友数:min_friends = math.ceil(10 / 3) = 4,即每个小朋友最多分 3 颗糖果,最少需要 4 个小朋友。
  • 最多小朋友数:max_friends = 10 // 2 = 5,即每个小朋友最少分 2 颗糖果,最多可以分给 5 个小朋友。
  • 结果:[4, 5]

示例 2

输入:n = 7, l = 3, r = 5

  • 最少小朋友数:min_friends = math.ceil(7 / 5) = 2,即每个小朋友最多分 5 颗糖果,最少需要 2 个小朋友。
  • 最多小朋友数:max_friends = 7 // 3 = 2,即每个小朋友最少分 3 颗糖果,最多可以分给 2 个小朋友。
  • 结果:[2, 2]

示例 3

输入:n = 8, l = 1, r = 4

  • 最少小朋友数:min_friends = math.ceil(8 / 4) = 2,即每个小朋友最多分 4 颗糖果,最少需要 2 个小朋友。
  • 最多小朋友数:max_friends = 8 // 1 = 8,即每个小朋友最少分 1 颗糖果,最多可以分给 8 个小朋友。
  • 结果:[2, 8]

学习总结

  • 这道题考察了数学中的向上取整(math.ceil)和整数除法(//)的应用。通过合理的条件判断,我们可以找到满足条件的最小和最大小朋友数。
  • 在解题过程中,检查是否能正好分配糖果是非常重要的一步,尤其是当糖果数量和小朋友数量有一定限制时。