贪心猫的鱼干大分配问题解析
问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
测试样例
输入:
n = 3, cats_levels = [1, 2, 2]
输出:4
输入:
n = 6, cats_levels = [6, 5, 4, 3, 2, 16]
输出:17
问题解析
- 通过题目我们知道每只小猫最少会分到一斤鱼干,如果一只猫的等级高于相邻的猫,则比相邻的猫多一斤鱼干,如果等级相同,那么两只相邻的猫鱼干数量一致。
- 我们可以使用一个数组
fish_amounts来记录每只猫得到的鱼干数量,初始化fish_amounts = [1]*n,n为猫的个数。
小知识点:
浅拷贝:
fish_amounts = [1]*n是指把一个列表重复了n次如果n=4结果等同于
[1,1,1,1]
3.遍历 cats_levels 数组,检查每只猫的等级是否高于相邻的猫。
- 如果当前猫的等级高于前一只猫,则当前猫的鱼干数量应比前一只猫多一斤。
- 如果当前猫的等级高于后一只猫,则当前猫的鱼干数量应比后一只猫多一斤。
4.最后用sum函数计算fish_amounts数组的总和,即为结果。
代码实现
def solution(n,cats_levels):
# Please write your code here
fish_amounts = [1]*n
for i in range(1,n):
if cats_levels[i] > cats_levels[i-1]:
fish_amounts[i] = fish_amounts[i - 1] + 1
for i in range(n - 2, -1, -1):
if cats_levels[i] > cats_levels[i + 1]:
fish_amounts[i] = max(fish_amounts[i], fish_amounts[i + 1] + 1)
return sum(fish_amounts)
if __name__ == "__main__":
# You can add more test cases here
print(solution(3,[1,2,2]) == 4)
print(solution(6,[6,5,4,3,2,16]) == 17)
4.for i in range(n - 2, -1, -1) 是一个循环语句,用于从 n-2 开始,递减到 -1(不包括 -1),每次递减 1。这个循环的目的是从数组的倒数第二个元素开始,向前遍历到数组的第一个元素。
思考与反省
在判断当前猫的等级是否高于后一只猫时,应注意[i+1]才是代表后一只猫,因为此时采用的循环是倒序。
本人写这道题的时候向Marscode AI寻求了帮助,在它给出的提示中可能会遇到自己没接触过的点,例如题中用到的浅拷贝,但也因此能够扩大自己的知识面,学到更多。