题解:糖果传递游戏
问题描述
小U和 n 个小朋友正在玩一个有趣的糖果传递游戏。n 个小朋友按顺序排成一列,小U站在最右边的位置。游戏开始时,小U为每个小朋友分配了 a[1], a[2], ..., a[n] 个糖果。现在,小U手里还剩下 m 个糖果要分配。
分配规则如下:
- 每个糖果都会先从第一个小朋友开始分配。如果当前小朋友的糖果数量(包括新分配的糖果)小于或等于他的右边的小朋友,则他会保留这个糖果。
- 如果当前小朋友的糖果数量大于他右边的小朋友,他会将这个糖果传递给下一个小朋友。
- 这个过程会持续,直到糖果传递到第
n个小朋友。如果第n个小朋友也不能保留这个糖果,那么糖果会被传递给小U。
现在,请你帮忙确定第 m 个糖果最终会分配给哪个小朋友,或者传递给小U。
解题思路
-
理解问题:
- 我们需要模拟糖果的分配过程,确保每个糖果都能正确传递到下一个小朋友,直到糖果被某个小朋友保留或传递给小U。
-
数据结构选择:
- 使用一个数组
a来存储每个小朋友的糖果数量。
- 使用一个数组
-
算法步骤:
- 遍历每个糖果,从第一个小朋友开始分配。
- 使用一个
while循环来传递糖果,直到糖果被某个小朋友保留或传递到最后一个小朋友。 - 如果糖果被某个小朋友保留,更新该小朋友的糖果数量。
- 如果糖果传递到最后一个小朋友且无法保留,返回
n + 1表示糖果被小U接收。
代码实现
def solution(n, m, a):
for candy in range(1, m + 1):
i = 0
while i < n - 1:
if a[i] + 1 > a[i + 1]:
i += 1 # 传递给下一个
else:
break
# 最终糖果被第 i 个小朋友保留
if i < n - 1:
a[i] += 1 # 更新该小朋友的糖果数量
else:
return n + 1 # 如果传递到最后一个小朋友且无法保留,糖果给小U
# 返回最后一个糖果被哪个小朋友拿到
return i + 1
if __name__ == "__main__":
# Add your test cases here
print(solution(6, 12, [5, 14, 13, 6, 6, 17]) == 7)
代码解释
-
遍历糖果:
for candy in range(1, m + 1):遍历每个糖果,从第一个糖果开始分配。
-
传递糖果:
while i < n - 1:使用while循环来传递糖果,直到糖果被某个小朋友保留或传递到最后一个小朋友。if a[i] + 1 > a[i + 1]:如果当前小朋友的糖果数量(包括新分配的糖果)大于他右边的小朋友,则传递给下一个小朋友。else: break:如果当前小朋友的糖果数量小于或等于他右边的小朋友,则保留这个糖果。
-
更新糖果数量:
if i < n - 1:如果糖果被某个小朋友保留,更新该小朋友的糖果数量。else: return n + 1:如果糖果传递到最后一个小朋友且无法保留,返回n + 1表示糖果被小U接收。
-
返回结果:
return i + 1:返回最后一个糖果被哪个小朋友拿到。
总结
通过模拟糖果的分配过程,我们可以确定每个糖果最终会被哪个小朋友保留,或者传递给小U。代码通过遍历每个糖果,并使用 while 循环来传递糖果,确保每个糖果都能正确分配。最终,代码返回最后一个糖果被哪个小朋友拿到,或者返回 n + 1 表示糖果被小U接收。