题解:糖果传递游戏 | 豆包MarsCode AI刷题

118 阅读3分钟

题解:糖果传递游戏

问题描述

小U和 n 个小朋友正在玩一个有趣的糖果传递游戏。n 个小朋友按顺序排成一列,小U站在最右边的位置。游戏开始时,小U为每个小朋友分配了 a[1], a[2], ..., a[n] 个糖果。现在,小U手里还剩下 m 个糖果要分配。

分配规则如下:

  1. 每个糖果都会先从第一个小朋友开始分配。如果当前小朋友的糖果数量(包括新分配的糖果)小于或等于他的右边的小朋友,则他会保留这个糖果。
  2. 如果当前小朋友的糖果数量大于他右边的小朋友,他会将这个糖果传递给下一个小朋友。
  3. 这个过程会持续,直到糖果传递到第 n 个小朋友。如果第 n 个小朋友也不能保留这个糖果,那么糖果会被传递给小U。

现在,请你帮忙确定第 m 个糖果最终会分配给哪个小朋友,或者传递给小U。

解题思路

  1. 理解问题

    • 我们需要模拟糖果的分配过程,确保每个糖果都能正确传递到下一个小朋友,直到糖果被某个小朋友保留或传递给小U。
  2. 数据结构选择

    • 使用一个数组 a 来存储每个小朋友的糖果数量。
  3. 算法步骤

    • 遍历每个糖果,从第一个小朋友开始分配。
    • 使用一个 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)

代码解释

  1. 遍历糖果

    • for candy in range(1, m + 1):遍历每个糖果,从第一个糖果开始分配。
  2. 传递糖果

    • while i < n - 1:使用 while 循环来传递糖果,直到糖果被某个小朋友保留或传递到最后一个小朋友。
    • if a[i] + 1 > a[i + 1]:如果当前小朋友的糖果数量(包括新分配的糖果)大于他右边的小朋友,则传递给下一个小朋友。
    • else: break:如果当前小朋友的糖果数量小于或等于他右边的小朋友,则保留这个糖果。
  3. 更新糖果数量

    • if i < n - 1:如果糖果被某个小朋友保留,更新该小朋友的糖果数量。
    • else: return n + 1:如果糖果传递到最后一个小朋友且无法保留,返回 n + 1 表示糖果被小U接收。
  4. 返回结果

    • return i + 1:返回最后一个糖果被哪个小朋友拿到。

总结

通过模拟糖果的分配过程,我们可以确定每个糖果最终会被哪个小朋友保留,或者传递给小U。代码通过遍历每个糖果,并使用 while 循环来传递糖果,确保每个糖果都能正确分配。最终,代码返回最后一个糖果被哪个小朋友拿到,或者返回 n + 1 表示糖果被小U接收。