问题重述
在猫星球上,小 R 要给一排排队的猫分发鱼干。每只猫都有一个等级,等级高的猫应得到更多鱼干。具体规则为每只猫至少得一斤鱼干,且若一只猫的等级高于其相邻的猫,它就应得到比相邻猫更多的鱼干。现在需要确定为了公平地满足所有猫的等级差异,小 R 至少需要准备多少斤鱼干。
问题思路
一、总体思路 遍历每只猫的等级,根据规则计算出每只猫所需的最少鱼干数量,然后将所有猫所需的鱼干数量累加起来,得到小 R 至少需要准备的鱼干总量。
二、具体步骤
- 输入猫的等级序列 - 可以提示用户输入猫的数量
n。 - 然后通过循环让用户依次输入每只猫的等级,存储在一个列表中。 - 遍历猫的等级列表并计算每只猫所需的最少鱼干数量 - 初始化一个列表来存储每只猫的鱼干数量,初始值都为 1,因为每只猫至少有一斤鱼干。 - 从左到右遍历等级列表: - 如果当前猫的等级高于前一只猫的等级,那么当前猫的鱼干数量应该是前一只猫的鱼干数量加 1。 - 再从右到左遍历等级列表: - 如果当前猫的等级高于后一只猫的等级,且当前猫的鱼干数量小于等于后一只猫的鱼干数量,那么当前猫的鱼干数量应该更新为后一只猫的鱼干数量加 1。
- 计算鱼干总量 - 将存储每只猫鱼干数量的列表中的所有元素累加起来,得到小 R 至少需要准备的鱼干总量。
- 输出结果 - 打印出小 R 至少需要准备的鱼干总量。
代码解析
以下是对这段 Python 代码的解析:
函数定义: python def solution(n, cats_levels): 这个函数接收两个参数,n代表猫的数量,cats_levels是一个列表,存储了每只猫的等级。
初始化鱼干数量列表: python fish = [1] * n 创建一个长度为n的列表fish,初始值都为 1,表示每只猫至少有一斤鱼干。
从左到右遍历: python for i in range(1, n): if cats_levels[i] > cats_levels[i - 1]: fish[i] = fish[i - 1] + 1 这部分代码从左到右遍历猫的等级列表。如果当前猫的等级(cats_levels[i])高于前一只猫的等级(cats_levels[i - 1]),那么当前猫的鱼干数量(fish[i])应该是前一只猫的鱼干数量(fish[i - 1])加 1。这样确保了等级高的猫在左边的情况下能得到比左边等级低的猫更多的鱼干。
从右到左遍历: python for i in range(n - 2, -1, -1): if cats_levels[i] > cats_levels[i + 1] and fish[i] <= fish[i + 1]: fish[i] = fish[i + 1] + 1 这里从右到左再次遍历猫的等级列表。如果当前猫的等级(cats_levels[i])高于后一只猫的等级(cats_levels[i + 1]),并且当前猫的鱼干数量(fish[i])小于等于后一只猫的鱼干数量(fish[i + 1]),那么当前猫的鱼干数量应该更新为后一只猫的鱼干数量加 1。这一步是为了确保等级高的猫在右边的情况下也能得到比右边等级低的猫更多的鱼干。
计算并返回鱼干总量: python return sum(fish) 最后,通过sum(fish)计算出列表fish中所有元素的总和,即小 R 至少需要准备的鱼干总量,并返回这个值。
知识点总结
这段代码主要用到了以下几个 Python 知识点:
- 列表推导式和初始化: -
fish = [1] * n使用了列表推导式的一种简单形式来创建一个长度为n的列表,其中每个元素初始值为 1。 - 循环遍历: - 使用
for循环遍历列表的索引范围。例如for i in range(1, n)和for i in range(n - 2, -1, -1)分别从左到右和从右到左遍历猫的等级列表的索引。 - 条件判断: - 在循环中使用条件判断语句来决定是否执行特定的操作。例如
if cats_levels[i] > cats_levels[i - 1]:和if cats_levels[i] > cats_levels[i + 1] and fish[i] <= fish[i + 1]:根据猫的等级关系和当前鱼干数量的比较来决定是否更新当前猫的鱼干数量。 - 列表索引访问: - 通过索引访问列表中的元素。如
cats_levels[i]访问猫等级列表中特定索引位置的猫等级,fish[i]访问鱼干数量列表中特定索引位置的鱼干数量。 - 函数定义和参数传递: - 定义了一个函数
solution,接收两个参数n和cats_levels,并在函数体内使用这些参数进行计算。 - 列表元素求和: - 使用
sum(fish)对鱼干数量列表中的所有元素进行求和,得到鱼干的总量。