青训/中等:糖果传递问题

中等:糖果传递问题.md

问题描述

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

分配规则如下:

每个糖果都会先从第一个小朋友开始分配。如果当前小朋友的糖果数量(包括新分配的糖果)小于或等于他的右边的小朋友,则他会保留这个糖果。
如果当前小朋友的糖果数量大于他右边的小朋友,他会将这个糖果传递给下一个小朋友。
这个过程会持续,直到糖果传递到第 n 个小朋友。如果第 n 个小朋友也不能保留这个糖果,那么糖果会被传递给小U。
现在,请你帮忙确定第 m 个糖果最终会分配给哪个小朋友,或者传递给小U。

样例

测试样例
样例1:

输入:n = 4, m = 3, a = [1, 2, 3, 4]
输出:1

样例2:

输入:n = 4, m = 2, a = [4, 3, 2, 3]
输出:5

样例3:

输入:n = 4, m = 2, a = [4, 3, 2, 2]
输出:5

答案

def solution(n, m, a):
    # 模拟分发每个糖果
    for candy in range(m):
        # 创建临时数组来存储当前糖果分配状态
        current = a.copy()
        pos = 0
        
        while pos < n:
            # 给当前小朋友添加糖果
            current[pos] += 1
            
            # 检查是否需要传递给下一个小朋友
            if pos < n - 1:  # 不是最后一个小朋友
                if current[pos] > current[pos + 1]:
                    pos += 1  # 传递给下一个小朋友
                else:
                    # 当前小朋友可以保留糖果
                    if candy == m - 1:  # 如果是最后一颗糖果
                        return pos + 1  # 返回1-based索引
                    # 更新实际的糖果数组
                    a[pos] = current[pos]
                    break
            else:  # 是最后一个小朋友
                # 最后一个小朋友的糖果一定传给小U,因为小U的糖果数可以认为是无限大
                if candy == m - 1:  # 如果是最后一颗糖果
                    return n + 1  # 给小U
                break
        
        # 如果糖果传递完整个队列或传给了最后一个小朋友
        if pos == n - 1:
            if candy == m - 1:  # 如果是最后一颗糖果
                return n + 1  # 返回小U的位置
        elif pos < n - 1:
            # 更新数组状态
            a[pos] = current[pos]
    
    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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值