[算法题]小朋友分糖问题(相同的相邻数据可以拥有不同的糖)

[算法题]小朋友分糖问题(相同的相邻数据可以拥有不同的糖)

问题:现在有n个小朋友坐成一排,每个小朋友都有一个竞赛得分,现在要根据竞赛得分给小朋友分糖,要求是相邻坐着的小朋友,分数高的小朋友的糖要比分数低的小朋友糖多(小朋友是随机坐的,也就是分数没排序),相邻的两个小朋友分数如果相同,分配糖的数量可以不同,现在程序要给出最少需要多少糖。

下面是网友的方案,比我自己写的方案简单了很多了,看上去就很清爽。。。而且没用递归,两次迭代就可以完成

import json
def candies_1(n, arr):
    N = n

    ratings = arr
    candies = [1 for i in range(N)]


    for i in range(len(ratings) - 1):
        le = ratings[i]
        ri = ratings[i + 1]

        if le < ri:
            candies[i + 1] = candies[i] + 1
        elif le > ri:
            if candies[i] == 1:
                for e in range(i, -1, -1):
                    if ratings[e] > ratings[e + 1] and candies[e] <= candies[e + 1]:
                        candies[e] = candies[e+1]+1
                    else:
                        break
            else:
                candies[i + 1] = 1  # candies[i] - 1 #max(1, prev-1)

    return sum(candies)

if __name__ == '__main__':

    n = 16387
    arr = []
    with open(r'E:\practices\python\test_data.json', 'r') as f:
        data = f.read()
        arr = json.loads(data)
    print(candies_1(n, arr))

三天三夜啊!终于自己用递归写出来了!

def candies(n, arr):
    arr = [[x, 1] for x in arr]
    for i in range(n):
        get_candy_num_v2(i, arr)
    return sum([x[1] for x in arr])

#返回当前小朋友应得糖的数量
def get_candy_num_v2(n,arr):
    #用于避免超出队列结尾的边界
    if n==len(arr)-1:
        return arr[n][1]
    #如果当前小朋友的竞赛分数比下一个小朋友的竞赛分数多。
    if arr[n][0] > arr[n+1][0]:
        #n代表当前小朋友;如果当前小朋友的糖比下一个小朋友的糖多,那么不增减它糖的数量,否则要比下一个小朋友的糖多1个。
        arr[n][1] = arr[n][1] if arr[n][1]>get_candy_num_v2(n+1,arr) else (arr[n+1][1]+1)
    elif arr[n][0] < arr[n+1][0]:
        #这里的做法是为了避免测试arr[n-1]时会在n=0时溢出队列范围,减少边界控制的问题。
        arr[n+1][1]=arr[n][1]+1

    return arr[n][1]
测试数据:
n=7
arr=[2,6,5,5,3,4,1]
结果:10
Comments are closed.