青训营X豆包MarsCode 技术训练营第九课 | 豆包MarsCode AI 刷题

125 阅读4分钟

方向一 - 学习方法与心得

题目解析:小R的徒步旅行与食物购买问题

在这个问题中,小R需要在N天内完成从地点A到地点B的徒步旅行,每天消耗1份食物。途中,他会遇到多个补给站,每个补给站的食物价格不同,且他最多只能携带K份食物。我们的目标是帮助小R以最小的花费完成旅行。

思路分析: 这个问题可以看作是一个贪心算法的问题。我们的目标是在保证每天有食物的情况下,尽量减少总花费。我们可以从以下几个方面来考虑:

  1. 优先购买低价食物:如果当前携带的食物不足以支持到下一个补给站,我们应该优先购买当前补给站的低价食物。
  2. 不超过携带上限:在购买食物时,我们需要注意不超过K的限制。
  3. 动态更新最低花费:随着旅行的进行,我们需要动态更新最低花费。

图解说明: 我们可以将这个问题想象成一个动态规划的过程,每一天都可能需要做出购买决策。我们可以画出一个简单的流程图,表示每天的决策过程。

代码详解:

def solution(n, k, data):
    cost = 0  # 总花费
    current = 0  # 当前携带的食物数量
    for i in range(n):
        # 如果当前携带的食物数量加上最大携带量 `k` 大于等于剩余天数,则不需要再购买食物
        if current + k >= n - i:
            break
        # 如果当前携带的食物数量加上1小于等于最大携带量 `k`,则购买当前补给站的食物
        if current + 1 <= k:
            cost += data[i]  # 购买当前补给站的食物
            current += 1  # 更新当前携带的食物数量
        else:
            # 如果不能购买更多食物,需要先消耗一些
            # 这里需要重新考虑逻辑,确保在任何情况下都能正确计算最低花费
            # 例如,可能需要找到下一个价格更低的食物补给站
            # 找到下一个价格更低的食物补给站
            next_cheaper = i + 1
            while next_cheaper < n and data[next_cheaper] >= data[i]:
                next_cheaper += 1
            # 如果找到了下一个价格更低的食物补给站
            if next_cheaper < n:
                # 计算需要消耗的食物数量
                to_consume = min(current, next_cheaper - i)
                current -= to_consume
            else:
                # 如果没有找到下一个价格更低的食物补给站,直接购买当前补给站的食物
                cost += data[i]
                current += 1
    return cost
​
if __name__ == "__main__":
    # Add your test cases here
    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)
​

知识总结:新知识点与学习建议

在解决这个问题的过程中,我学到了贪心算法的基本概念和应用。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。

个人理解: 贪心算法的关键在于每一步都做出局部最优的选择,但并不保证全局最优。在这个问题中,我们通过局部最优的选择(即在每个补给站购买最低价的食物),来尝试达到全局最优的结果(即最小花费)。

学习建议: 对于入门的同学,我建议从简单的贪心算法问题开始,逐步理解贪心算法的思想和应用。同时,多做一些相关的练习题,加深对贪心算法的理解。

学习计划:高效学习方法

结合豆包MarsCode AI刷题功能,我总结了以下高效学习方法:

  1. 制定刷题计划:每天固定时间进行刷题,保持学习的连续性。
  2. 针对性学习:遇到错题时,不仅要看答案,还要理解为什么错,如何改进。
  3. 定期复习:定期回顾做过的题目,巩固知识点。

工具运用:AI刷题功能与其他资源的结合

AI刷题功能可以与其他学习资源相结合,例如:

  1. 在线课程:通过在线课程学习理论知识,然后用AI刷题功能进行实践。
  2. 书籍:阅读算法书籍,结合AI刷题功能进行实战演练。
  3. 社区讨论:在技术社区中讨论问题,用AI刷题功能来验证自己的想法。

通过这样的结合,我们可以更好地理解和掌握算法知识,提高学习效率。