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

182 阅读4分钟

问题描述

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

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

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

问题理解

我们需要给每只猫分配鱼干,满足以下两个条件:

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

数据结构选择

我们可以使用一个数组 fish_distribution 来记录每只猫分配到的鱼干数量。初始时,每只猫至少得到一斤鱼干,即 fish_distribution[i] = 1

算法步骤

  1. 初始化:创建一个数组 fish_distribution,初始值为1。

  2. 遍历比较:从左到右遍历 cats_levels,比较当前猫和前一只猫的等级:

    • 如果当前猫的等级高于前一只猫,则当前猫的鱼干数量应比前一只猫多1。
    • 如果当前猫的等级等于或低于前一只猫,则当前猫的鱼干数量保持为1。
  3. 调整鱼干数量:由于我们只考虑了从左到右的比较,可能还需要从右到左再遍历一次,确保每只猫的鱼干数量满足条件。

  4. 计算总鱼干数量:最后,计算 fish_distribution 数组中所有元素的和,即为所需的最少鱼干数量。

处理等级相同的猫

处理等级相同的猫是一个关键点。我们需要确保在等级相同的猫之间,鱼干的分配是公平的,即它们得到的鱼干数量应该相同。

思路

  1. 初始化:每只猫至少得到一斤鱼干。
  2. 从左到右遍历:确保等级高的猫得到更多鱼干。
  3. 从右到左遍历:确保等级高的猫得到更多鱼干,并且在等级相同的猫之间,鱼干数量应该相同。

具体步骤

  1. 从左到右遍历

    • 如果当前猫的等级高于前一只猫,则当前猫的鱼干数量应比前一只猫多1。
    • 如果当前猫的等级等于前一只猫,则当前猫的鱼干数量应与前一只猫相同。
  2. 从右到左遍历

    • 如果当前猫的等级高于后一只猫,则当前猫的鱼干数量应比后一只猫多1。
    • 如果当前猫的等级等于后一只猫,则当前猫的鱼干数量应与后一只猫相同。

思考和感想

对于这个贪心猫的鱼干分配问题,我觉得它是一个很有趣且具有一定挑战性的算法问题。

它巧妙地利用了两次遍历的方式来处理猫的等级差异,从左到右和从右到左的遍历相互补充,确保了分配的公平性和合理性。这种双向遍历的思路很值得学习和借鉴。

这个问题让我们看到了如何通过巧妙的算法设计来解决实际生活中的分配问题,并且在处理等级相同的猫时,也需要考虑公平性,这对于培养细致的思维和严谨的逻辑很有帮助。同时,也让我们意识到在解决问题时,要充分考虑各种可能的情况,以达到最优的解决方案。

实现代码

def solution(n, cats_levels):
    # 初始化鱼干分配数组,每只猫至少得到一斤鱼干
    fish_distribution = [1] * n
    
    # 从左到右遍历,确保等级高的猫得到更多鱼干
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i - 1]:
            fish_distribution[i] = fish_distribution[i - 1] + 1
    
    # 从右到左遍历,确保等级高的猫得到更多鱼干
    for i in range(n - 2, -1, -1):
        if cats_levels[i] > cats_levels[i + 1]:
            fish_distribution[i] = max(fish_distribution[i], fish_distribution[i + 1] + 1)
    
    # 计算总鱼干数量
    total_fish = sum(fish_distribution)
    
    return total_fish

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)