打卡第一天 | 豆包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)
相关推荐
Find23 天前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵25 天前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记