徒步旅行中的补给问题
问题描述
小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N
天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以购买食物进行补充。然而,每个补给站的食物每份的价格可能不同,并且小R最多只能同时携带 K
份食物。
现在,小R希望在保证每天都有食物的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?
代码思路
代码思路
-
初始化变量:
min_money
:记录小R在旅行中总共花费的钱。ready
:一个优先队列(最小堆),用于存储当前可选的补给站的食物价格。food_in_bag
:记录当前小R背包中的食物数量。
-
遍历每一天:
- 消耗食物 :在每一天开始时,小R会消耗一份食物。如果背包中还有食物(
food_in_bag > 0
),则减少一份食物。如果没有食物,则需要从补给站购买。
- 消耗食物 :在每一天开始时,小R会消耗一份食物。如果背包中还有食物(
-
补给站的管理:
- 当小R没有食物时,首先需要确保从补给站中获取最便宜的食物。如果当前已知的补给站(存储在
ready
中)的数量小于 K 并且还有未遍历的补给站(day < n
),就将当前的补给站价格添加到堆中。 - 每次使用
heapq.heappush()
将新的价格添加到堆中,确保堆中始终存储当前可用的食物价格。
- 当小R没有食物时,首先需要确保从补给站中获取最便宜的食物。如果当前已知的补给站(存储在
-
购买食物:
- 从堆中取出最便宜的价格(使用
heapq.heappop()
),将该价格累加到min_money
中,并将food_in_bag
增加一,表示购买了一份食物。
- 从堆中取出最便宜的价格(使用
-
继续添加补给站价格:
- 如果还有更多的补给站(即
day < n
),将当天的补给站价格添加到堆中,准备在之后的日子中使用。
- 如果还有更多的补给站(即
解答
py
import heapq
def solution(n, k, data):
# Edit your code here
min_money = 0
ready = []
min_value = 0
for i in data:
# 当前站点加入ready
ready.append(i)
# 如果ready大于k,就将最先进入的站点价格删除
if len(ready) > k:
ready.pop(0)
# 找到最小值(这一步的时间复杂度应该为O(n))。如果在这里建堆就没必要了,时间复杂度可能提升至O(n*log()n)
min_value = min(ready)
min_money += min_value
return min_money
if __name__ == "__main__":
# 添加你的测试用例
print(solution(5, 2, [1, 2, 3, 3, 2]) == 9)
print(solution(6, 3, [4, 1, 5, 2, 1, 3]) == 9)
print(solution(4, 1, [3, 2, 4, 1]) == 10)