一、题目分析
本题描述了小 U 的徒步旅行场景,整个旅行需要 M 天,途中有 N 个补给站,每个补给站由所在天数 A 和每份食物价格 B 来描述,并且规定第 0 天一定有补给站且补给站按顺序出现。小 U 每天都得消耗一份食物,要在这些补给站购买食物,目标是规划出购买策略,使得花费的钱最少从而顺利完成旅行。通过给定的测试样例,像输入不同的天数、补给站数量以及补给站具体信息后输出相应的最少花费金额,能更直观地理解题目的具体要求和预期的计算结果。
二、代码实现思路讲解
(一)初始化最小花费
代码首先定义了变量 min_cost
并初始化为 0(min_cost = 0
),这个变量将用来累计整个旅行过程中购买食物的最小花费,随着后续对每一天购买策略的分析和计算,它的值会不断更新,最终得到完成 M 天旅行的最少花费金额。
(二)遍历每一天
使用一个 for
循环(for day in range(M):
)来遍历从第 0 天到第 M - 1 天的所有天数,模拟小 U 在旅行过程中的每一天的情况,因为每一天都需要考虑食物购买的问题,所以要逐天进行分析处理。
(三)寻找当前天及之前的最便宜的补给站
- 初始化最小价格为无穷大
在每次循环内部(也就是针对每一天),先将min_price
初始化为正无穷大(min_price = float('inf')
),这样做的目的是方便后续比较各个补给站的价格,能确保第一次比较时任何一个补给站的价格都会小于这个初始值,从而找到真正的最小价格。 - 遍历补给站进行比较
接着通过另一个for
循环(for station in p:
)来遍历所有的补给站信息列表p
。对于每个补给站,先判断其所在天数是否小于等于当前遍历到的天数(通过if station[0] <= day:
判断),如果是,那就说明这个补给站在当前天或者之前就已经可以到达了,此时将该补给站的食物价格与当前记录的最小价格min_price
进行比较,并通过min(min_price, station[1])
取两者中的较小值更新min_price
。例如,在某一天,已经遍历到的几个补给站价格分别是 3 元、2 元,经过这样的比较操作后,min_price
就会更新为 2 元,代表当前天及之前能到达的补给站中最便宜的价格。
(四)更新最小花费
一旦找到了当前天及之前最便宜的补给站价格 min_price
,就把这个价格累加到总的最小花费 min_cost
上(min_cost += min_price
),因为小 U 在这一天就会按照这个最便宜的价格去购买当天所需的一份食物。经过 M 天的循环和这样的花费累加操作后,min_cost
就记录了完成整个旅行的最少花费金额。
(五)返回结果
最后,通过 return min_cost
将计算得出的最小花费金额返回,这个返回值就是按照最优购买策略完成从地点 A 到地点 B 的 M 天徒步旅行所需要花费的最少钱数,也就是符合题目要求的最终答案。
py
def solution(M, N, p):
# 初始化最小花费
min_cost = 0
# 遍历每一天
for day in range(M):
# 找到当前天及之前的最便宜的补给站
min_price = float('inf')
for station in p:
if station[0] <= day:
min_price = min(min_price, station[1])
# 更新最小花费
min_cost += min_price
return min_cost
if __name__ == "__main__":
# Add your test cases here
print(solution(5, 4, [[0, 2], [1, 3], [2, 1], [3, 2]]) == 7)
print(solution(6, 5, [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]]) == 6)
print(solution(4, 3, [[0, 3], [2, 2], [3, 1]]) == 9)
````