打卡第一天 | 豆包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)
相关推荐
柠檬柠檬6 小时前
Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题
青训营笔记
用户967136399657 小时前
计算最小步长丨豆包MarsCodeAI刷题
青训营笔记
用户52975799354721 天前
字节跳动青训营刷题笔记2| 豆包MarsCode AI刷题
青训营笔记
clearcold1 天前
浅谈对LangChain中Model I/O的见解 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵2 天前
【字节青训营】 Go 进阶语言:并发概述、Goroutine、Channel、协程池 | 豆包MarsCode AI刷题
青训营笔记
用户336901104442 天前
数字分组求和题解 | 豆包MarsCode AI刷题
青训营笔记
dnxb1232 天前
GO语言工程实践课后作业:实现思路、代码以及路径记录 | 豆包MarsCode AI刷题
青训营笔记
用户916357440952 天前
AI刷题-动态规划“DNA序列编辑距离” | 豆包MarsCode AI刷题
青训营笔记
热的棒打鲜橙2 天前
数字分组求偶数和 | 豆包MarsCode AI刷题
青训营笔记
JinY142 天前
Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题
青训营笔记