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

213 阅读3分钟

题目分析: 题目描述了一个糖果传递游戏,参与者有 n 个小朋友,小U站在最右边(即位置 n),每个小朋友最初拥有一定数量的糖果。游戏的目的是将剩余的 m 个糖果按照一定规则分配给小朋友们,直到糖果分配完毕或者无法继续分配为止。最后,我们需要返回糖果最终分配给了哪一位小朋友,或者如果糖果分配到小U,则返回 n+1。 游戏规则:

  1. 小朋友们依次排成一列,编号从 1 到 n

  2. 每个小朋友最初拥有 a[1], a[2], ..., a[n] 个糖果。

  3. 小U站在最右边,小U并不参与糖果分配。

  4. 游戏开始时,小U手里有 m 个糖果,要按照一定的规则分配给小朋友们。

  5. 分配规则:糖果分配从左到右进行,每次只能分配一个糖果,并且必须遵循以下规则:

当前小朋友的糖果数量不能超过右边小朋友的糖果数量。也就是说,如果当前小朋友的糖果数量加 1 后大于右边小朋友的糖果数量,则不能给当前小朋友分配糖果,必须跳过他。

  1. 如果所有糖果都分配完了,返回 n + 1,表示糖果最终分配给小U。

  2. 如果没有糖果可以继续分配,返回当前正在分配糖果的小朋友的编号(从 1 开始)。 输入和输出: n:小朋友的数量。 m:剩余需要分配的糖果数。 a:一个列表,表示每个小朋友最初的糖果数量 [a[1], a[2], ..., a[n]]。 一个整数,表示最终分配糖果的目标小朋友的编号,或者 n+1(表示分配给小U)。

思路解析 我们从第一个小朋友开始分配糖果,分配规则是: 1. 从左到右依次给每个小朋友分配糖果。 1. 每次分配时,检查当前小朋友的糖果数量是否可以增加。具体来说,只有在当前小朋友的糖果数量加 1 不大于下一个小朋友的糖果数量时,才能给当前小朋友分配糖果。 1. 一旦糖果分配完毕,返回当前小朋友的编号;如果分配糖果时无法继续,说明糖果会交给小U(返回 n+1)。

  • 关键点是:

    • 判断当前小朋友是否可以接收糖果。
    • 如果不能继续分配糖果,直接返回 n+1,表示糖果没有继续分配给小朋友,而是被小U拿走。

时间复杂度分析

  • 每次分配糖果时都要遍历小朋友的列表,因此每次迭代需要 O(n) 的时间。
  • 总共需要分配 m 个糖果,所以时间复杂度为 O(n * m)
    # Edit your code here
    current_candy = 1  # 当前正在分配的糖果编号
    while current_candy <= m:
        for i in range(n-1):
            if a[i] + 1 <= a[i + 1]:
                # 如果当前小朋友是最后一个,或者他能保留这个糖果
                a[i] += 1
                if current_candy == m:
                    return i + 1  # 返回小朋友的编号(从1开始)
                break
            elif(i == n - 1): 
                return n+1
        current_candy += 1
    return n + 1  # 如果所有糖果都分配完了,返回n+1表示传递给小U
    return 0


if __name__ == "__main__":
    # Add your test cases here
    print(solution(4, 3, [1, 2, 3, 4]) == 1)
    print(solution(4, 2, [4, 3, 2, 3]) == 5)