贪心猫的鱼干大分配
问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
测试样例
样例1:
输入:
n = 3, cats_levels = [1, 2, 2]
输出:4
样例2:
输入:
n = 6, cats_levels = [6, 5, 4, 3, 2, 16]
输出:17
样例3:
输入:
n = 20, cats_levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
输出:35
这是一个经典的分发问题,可以使用贪心算法来解决。问题的核心是基于猫的等级关系来确定每只猫应该得到多少鱼干,保证以下几个条件:
- 每只猫至少得到 1 斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它应该得到比相邻的猫更多的鱼干。
解决思路:
可以通过两次遍历来分配鱼干:
- 正向遍历:从左到右遍历猫队列,如果某只猫的等级高于它左边的猫,则给它分配比左边猫更多的鱼干。
- 反向遍历:从右到左遍历猫队列,如果某只猫的等级高于它右边的猫,则确保它得到的鱼干比右边猫更多。如果在这一步发现猫需要更多的鱼干,则更新。
具体步骤:
- 创建一个数组
fish,用来记录每只猫分到的鱼干,初始值全为 1。 - 正向遍历(从左到右):如果当前猫等级高于左边的猫,则将当前猫的鱼干数设置为左边猫的鱼干数加 1。
- 反向遍历(从右到左):如果当前猫等级高于右边的猫,则将当前猫的鱼干数设置为右边猫的鱼干数加 1(同时需要保证不减少前面步骤分配的鱼干)。
最后,所有猫分配的鱼干总和即为答案。
参考代码
def solution(n, cats_levels): # 初始化每只猫得到的鱼干数量为1 fish = [1] * n
# 从左到右遍历猫的等级
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish[i] = fish[i - 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) # 返回所需的鱼干总数
if name == "main": # 测试用例 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)