问题描述
小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。