第七次算法笔记 | 豆包MarsCode AI刷题

一、题目分析

本题描述了小 U 的徒步旅行场景,整个旅行需要 M 天,途中有 N 个补给站,每个补给站由所在天数 A 和每份食物价格 B 来描述,并且规定第 0 天一定有补给站且补给站按顺序出现。小 U 每天都得消耗一份食物,要在这些补给站购买食物,目标是规划出购买策略,使得花费的钱最少从而顺利完成旅行。通过给定的测试样例,像输入不同的天数、补给站数量以及补给站具体信息后输出相应的最少花费金额,能更直观地理解题目的具体要求和预期的计算结果。

二、代码实现思路讲解

(一)初始化最小花费

代码首先定义了变量 min_cost 并初始化为 0(min_cost = 0),这个变量将用来累计整个旅行过程中购买食物的最小花费,随着后续对每一天购买策略的分析和计算,它的值会不断更新,最终得到完成 M 天旅行的最少花费金额。

(二)遍历每一天

使用一个 for 循环(for day in range(M):)来遍历从第 0 天到第 M - 1 天的所有天数,模拟小 U 在旅行过程中的每一天的情况,因为每一天都需要考虑食物购买的问题,所以要逐天进行分析处理。

(三)寻找当前天及之前的最便宜的补给站

  1. 初始化最小价格为无穷大
    在每次循环内部(也就是针对每一天),先将 min_price 初始化为正无穷大(min_price = float('inf')),这样做的目的是方便后续比较各个补给站的价格,能确保第一次比较时任何一个补给站的价格都会小于这个初始值,从而找到真正的最小价格。
  2. 遍历补给站进行比较
    接着通过另一个 for 循环(for station in p:)来遍历所有的补给站信息列表 p。对于每个补给站,先判断其所在天数是否小于等于当前遍历到的天数(通过 if station[0] <= day: 判断),如果是,那就说明这个补给站在当前天或者之前就已经可以到达了,此时将该补给站的食物价格与当前记录的最小价格 min_price 进行比较,并通过 min(min_price, station[1]) 取两者中的较小值更新 min_price。例如,在某一天,已经遍历到的几个补给站价格分别是 3 元、2 元,经过这样的比较操作后,min_price 就会更新为 2 元,代表当前天及之前能到达的补给站中最便宜的价格。

(四)更新最小花费

一旦找到了当前天及之前最便宜的补给站价格 min_price,就把这个价格累加到总的最小花费 min_cost 上(min_cost += min_price),因为小 U 在这一天就会按照这个最便宜的价格去购买当天所需的一份食物。经过 M 天的循环和这样的花费累加操作后,min_cost 就记录了完成整个旅行的最少花费金额。

(五)返回结果

最后,通过 return min_cost 将计算得出的最小花费金额返回,这个返回值就是按照最优购买策略完成从地点 A 到地点 B 的 M 天徒步旅行所需要花费的最少钱数,也就是符合题目要求的最终答案。

py 复制代码
def solution(M, N, p):
    # 初始化最小花费
    min_cost = 0
    
    # 遍历每一天
    for day in range(M):
        # 找到当前天及之前的最便宜的补给站
        min_price = float('inf')
        for station in p:
            if station[0] <= day:
                min_price = min(min_price, station[1])
        
        # 更新最小花费
        min_cost += min_price
    
    return min_cost

if __name__ == "__main__":
    # Add your test cases here
    print(solution(5, 4, [[0, 2], [1, 3], [2, 1], [3, 2]]) == 7)
    print(solution(6, 5, [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]]) == 6)
    print(solution(4, 3, [[0, 3], [2, 2], [3, 1]]) == 9)
    ````
相关推荐
幻64 天前
小S的倒排索引 | 豆包MarsCode AI刷题
青训营笔记
用户826014428305 天前
469. 环形数组最大子数组和问题
青训营笔记
用户605721920986 天前
奇妙货币交易问题 | 豆包MarsCode AI刷题
青训营笔记
我明天再来学Web渗透7 天前
“抖音互联网架构分析及高可用系统构建思考”(方向三)| 豆包MarsCode AI刷题
青训营笔记
用户302133066208 天前
第三次刷题 | 豆包MarsCode AI刷题
青训营笔记
用户91059730277013 天前
CSS详解| 豆包MarsCode AI刷题
青训营笔记
huyck13 天前
伴学笔记1|豆包MarsCode AI 刷题
青训营笔记
用户197009008153818 天前
实现一个TodoList | 青训营 x 豆包MarsCode技术训练营
青训营笔记
幻618 天前
小U的相似字符串 | 豆包MarsCode AI刷题
青训营笔记