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

80 阅读4分钟

贪心猫的鱼干大分配

问题概述

我们需要给一行排队的猫发鱼干。每只猫都有一个等级,在相邻的猫中,等级高的猫会获得比等级低的猫更多的鱼干。 举个例子,当n=6,cats levels=[6,5,4,3,2,16]时,每只猫所获得的鱼干数将为[5, 4, 3, 2, 1, 2]

题目解析

代码展示

def solution(n, cats_levels):
    cat= [1 for i in range(n)]
    for i in range(1,n):
        if cats_levels[i]>cats_levels[i-1]:
            cat[i]=cat[i-1]+1
    for i in range(n-2,-1,-1):
        if cats_levels[i]>cats_levels[i+1]:
            cat[i]=max(cat[i],cat[i+1]+1)
    result=0
    for i in range(n):
        result+=cat[i]
    return result

思路分析

根据题目中“贪心”二字,我们可以得出该题可以用贪心算法来解决。(bushi

首先,初始化一个长度为n,初始值全部为1的cat列表来记录每只猫所获得的鱼干数,每只猫至少得到一斤鱼干。

如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干,这个条件可以拆分成比其等级低的左边的猫鱼干数多和比其等级低的右边的猫鱼干数多。

为了满足比其等级低的左边的猫鱼干数多,我们可以从从第二只猫开始遍历,如果当前猫的等级高于其左边的猫,则更新当前猫的鱼干数量为左边猫的鱼干数量加一。

然后为了使比其等级低的右边的猫鱼干数多,从倒数第二只猫开始遍历,如果当前猫的等级高于其右边的猫,并且当前猫的鱼干数量不大于右边猫的鱼干数量加一,则更新当前猫的鱼干数量为两者中的较大值,这样确保如果一只猫的等级高于其右边的猫,并且之前的遍历没有给它分配足够的鱼干,则它会得到更多的鱼干。

最后我们只需要遍历cat列表,累加每只猫的鱼干数量就可以得到所需最少的鱼干数量啦。

个人思考与分析

接触这个猫星球鱼干分配问题时,我首先理解到这是一个基于猫等级差异来分配资源的问题。每只猫至少应得到一斤鱼干,而如果一只猫的等级高于其相邻的猫,那么它应该得到更多的鱼干。这个问题需要找到一个满足所有条件且总鱼干数量最小的方案。

我开始思考如何设计一个算法来解决这个问题。首先,我意识到需要给每只猫分配一个初始的鱼干数量,这个数量至少为一斤。然后,我考虑从左到右遍历猫队列,检查每只猫的等级是否高于其左边的猫,如果是,则增加其鱼干数量。然而,这样做可能不足以满足所有条件,因为可能存在右边等级更高的猫。

为了解决这个问题,我决定再进行一次从右到左的遍历。在这次遍历中,我检查每只猫的等级是否高于其右边的猫,并且如果当前的鱼干数量不足以满足这个条件(即不大于右边猫的鱼干数量加一),则更新其鱼干数量。然后,我遍历整个列表,累加每只猫的鱼干数量,得到了所需的总鱼干数量。

这个问题的解决过程让我对贪心算法和动态规划有了更深入的理解。我意识到,在编程中,清晰地理解问题、制定合理的解决方案以及进行有效的代码实现是非常重要的。这个问题也让我认识到,在面对实际问题时,需要灵活运用算法思想,结合问题的特点来寻找最佳解决方案。

总的来说,这个猫星球鱼干分配问题是一个有趣且具有挑战性的问题。通过解决这个问题,我不仅提高了自己的编程能力,还加深了对贪心算法和动态规划的理解。我相信,在未来的学习和工作中,这些经验和知识将对我产生积极的影响。