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

79 阅读4分钟

问题描述

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

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

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

问题分析

第一次思路:

设鱼干数step初始为0,创建对应的鱼干数组,遍历等级数组,当下一只猫等级比上一只猫等级大时,step加一并赋予下一只猫;当下一只猫等级比上一只猫等级小时,step减一并赋予下一只猫;最后能够得到符合等级趋势的鱼干数组,再全体加长鱼干最小值和1的差,使数组中所有数都大于等于1,返回数组总和。

错误点:

未考虑到当一只猫的等级比相邻猫都小时,这只猫的鱼干可以尽可能小且能满足题意;此外需要考虑的还有:在数组两端存在差异;当一一只猫的等级比相邻猫都大时,该猫的鱼干数取决于相邻猫中的较大值。

第二次思路:

通过逐一对猫的鱼干进行赋值:创建对应的鱼干数组并全部置0,当鱼干数组还有未赋值时(等于0),以同一指针i遍历等级数组和鱼干数组,当该猫的鱼干为0时,取另一指针j找到在i之和有多少猫与该i猫等级一致,并将他们视为一个整体;j最后的值是之后第一个不同等级的猫或数组长度n。

  1. 当i==0且i猫等级比j猫小时,赋予[i:j]全部猫鱼干数量为1;
  2. 当i==0且i猫等级比j猫大且j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为j猫鱼干数量加1;
  3. 当j==n且i猫等级比i-1猫小时,赋予[i:j]全部猫鱼干数量为1;
  4. 当j==n且i猫等级比i-1猫大且i-1猫鱼干已赋值时,赋予[i:j]猫鱼干数量为i-1猫鱼干数量加1;
  5. 当i!=0且j!=n且i-1猫等级比i猫等级大且j猫等级比i猫大时,赋予[i:j]全部猫鱼干数量为1;
  6. 当i!=0且j!=n且i-1猫等级比i猫等级小且j猫等级比i猫大且i-1猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为i-1猫鱼干数量加1;
  7. 当i!=0且j!=n且i-1猫等级比i猫等级大且j猫等级比i猫小且j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为j猫鱼干数量加1;
  8. 当i!=0且j!=n且i-1猫等级比i猫等级小且j猫等级比i猫小且i-1、j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为i-1、j猫鱼干数量较大值;
  9. 若以上情况都不符合,暂时跳过。 最后直至鱼干数组全部赋值,再返回数组总和。

错误点:

同等级且相邻的猫所得鱼干是要相等的,但事实是同等级且相邻的猫之间鱼干数之差可以随意赋值。

第三次思路:

在第二次思路的基础上进行修改,去掉遍历寻找相邻同等级的操作,把相邻同等级的情况加入到原来的情况里,例如左右都相等时可以加入左右都大于的情况。

最终代码:

def solution(n, cats_levels):
    c=cats_levels
    # Please write your code here
    fish=[0 for i in range(n)]
    while(0 in fish):
        i=0
        while(i<n):
            if fish[i]==0:
                if i==0 and c[i+1]>=c[i]:
                    fish[i]=1
                elif i==0 and c[i+1]<c[i] and fish[i+1]!=0:
                    fish[i]=fish[i+1]+1
                elif i==n-1 and c[i-1]>=c[i]:
                    fish[i]=1
                elif i==n-1 and c[i-1]<c[i] and fish[i-1]!=0:
                    fish[i]=fish[i-1]+1
                elif c[i-1]>=c[i] and c[i+1]>=c[i]:
                    fish[i]=1
                elif c[i-1]<c[i] and c[i+1]>=c[i] and fish[i-1]!=0:
                    fish[i]=fish[i-1]+1
                elif c[i-1]>=c[i] and c[i+1]<c[i] and fish[i+1]!=0:
                    fish[i]=fish[i+1]+1
                elif c[i-1]<c[i] and c[i+1]<c[i] and fish[i-1]!=0 and fish[i+1]!=0:
                    fish[i]=max(fish[i-1], fish[i+1])+1
                else:
                    pass
                i=i+1
            else:
                i=i+1
    return sum(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)