问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
求解思路
贪心算法:
初始状态给分配一个鱼干,,分别就两个方向进行遍历
- 从左至右: 对于非第一的每只小猫,如果等级大于它左侧的小猫,就在其左侧小猫的鱼干数基础上多分配一个,否则保持不变。
- 从右至左: 原理类似,方向反过来。
最后对于每个小猫,分配的鱼干是两次遍历所得鱼干数量的最大值。
为什么需要两次遍历?
假设在左向遍历的情况下。因为如果小猫等级小于它左侧的小猫,它保持初始状态,如果它右侧的的小猫等级低于它,也保持初始状态,就无法保证相邻的情况下等级较高的小猫获得更多的鱼干这一条件,因此需要两次遍历。
代码
def solution(n, cats_levels):
# Please write your code here
left_scan = [1] * n
right_scan = [1] * n
for i in range(1,n):
if cats_levels[i-1] < cats_levels[i]:
left_scan[i] = left_scan[i-1] + 1
for i in range(n-2,-1,-1):
if cats_levels[i] > cats_levels[i+1]:
right_scan[i] = right_scan[i+1] + 1
return sum([max(left_scan[i],right_scan[i]) for i in range(n)])
if __name__ == "__main__":
# You can add more test cases here
cats_levels1 = [1, 2, 2]
cats_levels2 = [6, 5, 4, 3, 2, 16]
cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
print(solution(3, cats_levels1) == 4)
print(solution(6, cats_levels2) == 17)
print(solution(20, cats_levels3) == 35)