问题描述
小U计划进行一场从地点A到地点B的徒步旅行,旅行总共需要 M 天。为了在旅途中确保安全,小U每天都需要消耗一份食物。在路程中,小U会经过一些补给站,这些补给站分布在不同的天数上,且每个补给站的食物价格各不相同。
小U需要在这些补给站中购买食物,以确保每天都有足够的食物。现在她想知道,如何规划在不同补给站的购买策略,以使她能够花费最少的钱顺利完成这次旅行。
- M:总路程所需的天数。
- N:路上补给站的数量。
- p:每个补给站的描述,包含两个数字 A 和 B,表示第 A 天有一个补给站,并且该站每份食物的价格为 B 元。
保证第0天一定有一个补给站,并且补给站是按顺序出现的。
测试样例
样例1:
输入:m = 5 ,n = 4 ,p = [[0, 2], [1, 3], [2, 1], [3, 2]]
输出:7
样例2:
输入:m = 6 ,n = 5 ,p = [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]]
输出:6
样例3:
输入:m = 4 ,n = 3 ,p = [[0, 3], [2, 2], [3, 1]]
输出:9
解题思路
这道题目综合运用了贪心算法和动态规划的知识,题目要求在给定的补给站中,找到一种购买食物的策略,使得总花费最小。每个补给站的食物价格不同,且补给站是按顺序出现的。我们可以通过贪心算法来解决这个问题,即在每个补给站选择当前最便宜的食物价格,直到旅行结束。
- 初始化:从第0天的补给站开始,记录当前的最小价格 min_price 和对应的补给站天数 min_price_index。
- 遍历补给站:从第1天开始,遍历每个补给站,检查当前补给站的食物价格是否比之前记录的最小价格更便宜。
如果当前补给站的食物价格更便宜,则计算从上一个最小价格补给站到当前补给站之间的花费,并更新最小价格和对应的补给站天数。 - 计算剩余花费:遍历结束后,计算从最后一个最小价格补给站到旅行结束的天数之间的花费。
- 返回总花费:将所有部分的花费累加,得到最终的最小花费。
- 时间复杂度:O(N),其中 N 是补给站的数量。我们只需要遍历一次补给站列表。
- 空间复杂度:O(1),只使用了常数级别的额外空间。
代码
代码看起来可能难理解一点点,建议添加断点,查看变量的变化,这样更有助于理解!
def solution(m: int, n: int, p: list) -> int

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



