打卡第一天 | 豆包MarsCode AI刷题

徒步旅行中的补给问题

问题描述

小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N 天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以购买食物进行补充。然而,每个补给站的食物每份的价格可能不同,并且小R最多只能同时携带 K 份食物。

现在,小R希望在保证每天都有食物的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?

代码思路

代码思路

  1. 初始化变量

    • min_money:记录小R在旅行中总共花费的钱。
    • ready:一个优先队列(最小堆),用于存储当前可选的补给站的食物价格。
    • food_in_bag:记录当前小R背包中的食物数量。
  2. 遍历每一天

    • 消耗食物 :在每一天开始时,小R会消耗一份食物。如果背包中还有食物(food_in_bag > 0),则减少一份食物。如果没有食物,则需要从补给站购买。
  3. 补给站的管理

    • 当小R没有食物时,首先需要确保从补给站中获取最便宜的食物。如果当前已知的补给站(存储在 ready 中)的数量小于 K 并且还有未遍历的补给站(day < n),就将当前的补给站价格添加到堆中。
    • 每次使用 heapq.heappush() 将新的价格添加到堆中,确保堆中始终存储当前可用的食物价格。
  4. 购买食物

    • 从堆中取出最便宜的价格(使用 heapq.heappop()),将该价格累加到 min_money 中,并将 food_in_bag 增加一,表示购买了一份食物。
  5. 继续添加补给站价格

    • 如果还有更多的补给站(即 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)
相关推荐
用户447103089324210 小时前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记
用户58368380067610 小时前
学习笔记22《易速鲜花聊天客服机器人的开发(上)》
青训营笔记
用户2856200171317 小时前
寻找观光景点组合的最高得分| 豆包MarsCode AI 刷题
青训营笔记
用户48486281292221 天前
LangChain启程篇 | 豆包MarsCode AI刷题
青训营笔记
用户1538734266802 天前
前端框架中的设计模式解析
青训营笔记
努力的小Qin3 天前
小T的密码变换规则(青训营X豆包MarsCode) | 豆包MarsCode AI 刷题
青训营笔记
liangxiu3 天前
CSS布局技巧汇总| 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵11 天前
Go 垃圾回收 | 豆包MarsCode AI刷题
青训营笔记
末班车42212 天前
前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记
VanceLLF12 天前
神奇数字组合 | 豆包MarsCode AI刷题
青训营笔记