177.小C的糖果分配问题 | 豆包MarsCode AI刷题

69 阅读3分钟

问题描述

小C有一堆糖果,总共有𝑛颗。她需要将糖果分给小朋友们,每个小朋友的糖果数量必须在𝑙到𝑟之间。她想知道,在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回-1。

解题思路

问题理解

小C需要将糖果分给小朋友们,每个小朋友的糖果数量必须在给定的区间 [l, r] 之间。我们需要计算在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回 -1。

数据结构选择

这个问题不需要复杂的数据结构,只需要基本的数学运算和条件判断。

算法步骤

计算最少小朋友数量: 最少小朋友数量可以通过将糖果总数 n 除以每个小朋友最多能得到的糖果数 r 并向上取整得到。即 min_friends = math.ceil(n / r)。 这是因为每个小朋友最多能得到 r 颗糖果,所以最少需要 min_friends 个小朋友来分完糖果。 计算最多小朋友数量: 最多小朋友数量可以通过将糖果总数 n 除以每个小朋友最少能得到的糖果数 l 并向下取整得到。即 max_friends = n // l。 这是因为每个小朋友最少能得到 l 颗糖果,所以最多需要 max_friends 个小朋友来分完糖果。 检查是否可以正好分配糖果: 如果 min_friends * l > n,说明即使每个小朋友都得到最少的糖果数 l,糖果总数 n 也不够分,返回 -1。 如果 max_friends * r < n,说明即使每个小朋友都得到最多的糖果数 r,糖果总数 n 也分不完,返回 -1。 返回结果: 如果上述条件都满足,返回 [min_friends, max_friends]。

图解

每个小朋友的糖果数量范围 [l, r] = [2, 3]
最少小朋友数量:
  min_friends = math.ceil(10 / 3) = 4
最多小朋友数量:
  max_friends = 10 // 2 = 5
检查是否可以正好分配糖果:
  4 * 2 = 8 <= 10 (满足)
  5 * 3 = 15 >= 10 (满足)
返回结果:
  [4, 5]

代码实现

 
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])

知识点总结

  • 数学运算: 向上取整 (math.ceil) 和向下取整 (//) 的使用。 乘法和除法的基本运算。

  • 条件判断: 通过条件判断来验证是否可以正好分配糖果。

  • 边界条件处理: 处理糖果无法正好分完的情况,返回 -1。