[算法题]小朋友分糖问题(相同的相邻数据可以拥有不同的糖)
问题:现在有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