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

125 阅读3分钟

问题描述

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

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

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

思路分析

初始化每只猫的鱼干数量,都为一斤鱼干

判断当前猫的等级是否高于相邻的两只猫,若高于相邻的猫,则在基础上再加一斤鱼干。

算法步骤

  1. 初始化:首先,每只猫至少得到1斤鱼干,所以我们可以初始化一个数组 fish,其中每个元素初始值为1。
  2. 从左到右遍历:从左到右遍历猫的等级,如果当前猫的等级高于前一只猫的等级,那么当前猫的鱼干数量应该比前一只猫多1。
  3. 从右到左遍历:从右到左遍历猫的等级,确保如果当前猫的等级高于后一只猫的等级,那么当前猫的鱼干数量应该比后一只猫多1。这里需要使用 max 函数来确保鱼干数量满足条件。
  4. 计算总和:最后,计算所有猫的鱼干总和,即为所需的最少鱼干数量。

代码实现

def solution(n, cats_levels):
    # Please write your code here
    # 初始化每只猫的鱼干数量,初始为1
    fish = [1] * n
    
    # 从左到右遍历猫的等级
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i - 1]:
            fish[i] = fish[i - 1] + 1  # 如果当前猫等级高于前一只猫,鱼干加1
    
    # 从右到左遍历猫的等级
    for i in range(n - 2, -1, -1):
        if cats_levels[i] > cats_levels[i + 1]:
            fish[i] = max(fish[i], fish[i + 1] + 1)  # 确保鱼干满足条件
    
    # 返回所有鱼干的总和
    return sum(fish)
    # return -1

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)

知识总结

这道题目可以归类为“分配问题”,涉及数组的动态变化和条件判断。 用于解决猫分配鱼干的问题的核心思想是:

  1. 初始分配:每只猫至少得到1斤鱼干。

  2. 前后比较:通过两次遍历(一次从左到右,一次从右到左)来调整鱼干的分配,确保对每只猫的等级差异满足条件。

    • 从左到右遍历时,比较当前猫与前一只猫的等级,若当前等级高,则其鱼干要比前一只猫多1斤。
    • 从右到左遍历时,确保避免因为前面的调整而影响到当前猫的鱼干数量。通过max函数来取更大的鱼干值,从而满足条件。

学习建议:

  1. 掌握动态规划:虽然这个问题不像传统的动态规划那样复杂,但理解如何通过状态转移(在此例中根据鱼干数量的调整)来解决问题是很重要的。
  2. 练习双指针技巧:这道题实际上使用了类似双指针的思路,通过两个不同的方向遍历数组来更新鱼干的分配。可以多练习一些双指针题。