AI 刷题 2 徒步旅行 题解 | 豆包MarsCode AI刷题

28 阅读3分钟

解题思路

为了最小化小R在徒步旅行中的食物花费,我们可以采用贪心算法。贪心算法的核心思想是:在每一步都做出当前看起来最优的选择,从而希望最终得到全局最优解。

具体来说,我们可以从第一天开始,逐步计算每天需要购买的食物数量。由于小R每天都需要消耗1份食物,并且最多只能携带 K 份食物,因此我们需要在每天的补给站做出最优的购买决策。

具体步骤

初始化 :从第一天开始,初始化当前携带的食物数量为0,总花费为0。 遍历每一天

-   如果当前携带的食物数量足够当天使用(即 `current_food >= 1`),则不需要购买食物。
-   如果当前携带的食物数量不足(即 `current_food < 1`),则需要购买食物。购买的数量为 `min(K - current_food, n - i)`,其中 `n - i` 是剩余的天数。
-   更新总花费和当前携带的食物数量。

返回总花费

具体代码


def minimum_cost(n, k, prices):

# 初始化当前携带的食物数量和总花费

current_food = 0

total_cost = 0

# 遍历每一天

for i in range(n):

# 如果当前携带的食物数量不足,需要购买食物

if current_food < 1:

# 计算需要购买的食物数量

buy_amount = min(k - current_food, n - i)

# 更新总花费

total_cost += buy_amount * prices[i]

# 更新当前携带的食物数量

current_food += buy_amount

# 每天消耗1份食物

current_food -= 1

return total_cost

  


# 测试样例

n = 5

k = 2

data = [1, 2, 3, 3, 2]

print(minimum_cost(n, k, data)) # 输出: 9

### 详细注释

**函数定义** :

    def minimum_cost(n, k, prices):

    定义一个名为 `minimum_cost` 的函数,参数 `n` 是旅行的天数,`k` 是小R最多能携带的食物数量,`prices` 是每天补给站的食物价格列表。

**初始化变量** :

 
    current_food = 0

    total_cost = 0

    初始化当前携带的食物数量 `current_food` 为 0,总花费 `total_cost` 为 0。

 **遍历每一天** :

 
    for i in range(n):

    使用 `for` 循环遍历每一天。

 **检查当前食物数量** :

   
    if current_food < 1:

    如果当前携带的食物数量不足(即 `current_food < 1`),则需要购买食物。

 **计算购买数量** :

  
    buy_amount = min(k - current_food, n - i)

    计算需要购买的食物数量。购买的数量为 `min(k - current_food, n - i)`,其中 `k - current_food` 是当前可以携带的最大食物数量,`n - i` 是剩余的天数。

**更新总花费** :

  

    total_cost += buy_amount * prices[i]

    更新总花费,即购买的食物数量乘以当天的食物价格。

 **更新当前携带的食物数量** :


    current_food += buy_amount

    更新当前携带的食物数量。

 **每天消耗1份食物** :


    current_food -= 1

    每天消耗1份食物。
    
 **返回总花费** :

  
    return total_cost

    返回总花费。

 **测试样例** :

    
    n = 5

    k = 2

    data = [1, 2, 3, 3, 2]

    print(minimum_cost(n, k, data)) # 输出: 9

    定义一个测试样例,并调用 `minimum_cost` 函数,打印出结果。

算法分析

  • 时间复杂度 :O(n),其中 n 是旅行的天数。我们只需要遍历一次 prices 列表,对每个元素进行常数时间的操作。
  • 空间复杂度 :O(1),我们只使用了常数级别的额外空间来存储变量 current_foodtotal_cost

这个算法通过贪心策略,在每一步都做出最优的选择,从而保证了最终的总花费最小。