这个问题要求我们在满足每个小朋友分到的糖果数量必须在 l 和 r 之间的前提下,计算最少和最多可以分给多少个小朋友。我们还需要判断是否能够正好分完所有糖果,如果不能正好分配糖果,返回 -1。
关键思路
-
最少小朋友数量:
- 每个小朋友最多分
r颗糖果。如果要分n颗糖果,最少需要多少个小朋友呢?
可以通过min_friends = math.ceil(n / r)来计算。因为如果每个小朋友分r颗糖果,math.ceil(n / r)就是最少需要的小朋友数。
- 每个小朋友最多分
-
最多小朋友数量:
- 每个小朋友最少分
l颗糖果。如果要分n颗糖果,最多需要多少个小朋友呢?
可以通过max_friends = n // l来计算。因为如果每个小朋友分l颗糖果,n // l就是最多可以分给的小朋友数。
- 每个小朋友最少分
-
检查是否能够正好分完糖果:
-
我们需要检查是否可以将
n颗糖果分配给满足条件的小朋友数量。如果我们将糖果分给min_friends和max_friends个小朋友,是否能正好分完糖果?
- 如果
min_friends * l > n,说明即使每个小朋友最少分l颗糖果,所需的糖果数也已经超过n,所以无法分配。 - 如果
max_friends * r < n,说明即使每个小朋友最多分r颗糖果,糖果数也不足以分配给max_friends个小朋友,所以也无法分配。
-
-
返回结果:
- 如果满足分配条件,就返回
[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]### 代码解释
-
min_friends = math.ceil(n / r):- 使用
math.ceil计算最少的小朋友数,因为如果每个小朋友分r颗糖果,就可能有剩余的糖果。我们需要math.ceil来向上取整,确保每个小朋友都可以分到糖果。
- 使用
-
max_friends = n // l:- 使用整数除法
//计算最多的小朋友数,因为如果每个小朋友分l颗糖果,我们可以分配到的最多小朋友数就是n // l。
- 使用整数除法
-
检查是否可以正好分完糖果:
min_friends * l > n表示最少的小朋友数如果每人分l颗糖果就不够分配糖果。max_friends * r < n表示最多的小朋友数如果每人分r颗糖果就无法分完所有糖果。
-
返回值:
- 如果可以分配糖果,则返回
[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)和整数除法(//)的应用。通过合理的条件判断,我们可以找到满足条件的最小和最大小朋友数。 - 在解题过程中,检查是否能正好分配糖果是非常重要的一步,尤其是当糖果数量和小朋友数量有一定限制时。