贪心猫的鱼干大分配| 豆包MarsCode AI 刷题

128 阅读2分钟

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。

小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)