一、问题概述
在这道徒步旅行补给的问题中,小R要进行一次N天的徒步旅行,每天需要消耗1份食物。途中每天都有一个补给站,各补给站食物价格不同,且小R最多只能携带K份食物。目标是在保证每天都有食物的前提下,找到最小花费完成旅行的方法。
二、解题思路剖析
核心逻辑
1.按天决策
代码的核心逻辑是按天来决定是否购买食物以及购买多少。从第一天开始,不断判断后续情况来做出购买决策,直到完成整个N天的行程。
2.比较策略
2.1下一天价格更低
如果没有食物则购买当天食物并进入下一天,若当前有食物则直接进入下一天
2.2今天是最后一天
若没有食物则购买当天食物结束旅行,若有食物则直接结束旅行
2.3下一天价格更高
查找未来K天内价格比今天低的日子
2.3.1找到低价日
如果到达低价日需购买的食物份数大于已有的的份数,则购买足够到达那天的食物
如果到达地假日需购买的食物份数小于已有的份数,不购买食物
2.3.2未找到低价日
若当前日期已接近终点:购买能够到达终点的食物
若当前未接近终点但算上已有的食物再购买一次即可到达终点,则购买到达终点还缺少的食物
若算上已有食物再次购买依然不能到达终点,则购买还可购买的份数
三、代码
cost = 0
current_day = 0
knum=k
while current_day < n:
if current_day + 1 < n and data[current_day + 1] < data[current_day]:
if knum==k:
cost += data[current_day]
current_day += 1
else:
current_day += 1
knum+=1
elif current_day + 1 ==n:
if knum==k:
cost += data[current_day]
current_day += 1
else:
current_day += 1
else:
min_price_day = current_day
found_lower_price = False
for i in range(current_day, min(current_day + k , n)):
if data[i] < data[min_price_day]:
min_price_day = i
found_lower_price = True
break
if found_lower_price:
if min_price_day - current_day>k-knum:
cost += (min_price_day - current_day-(k-knum)) * data[current_day]
current_day = min_price_day
knum=k
else:
knum+=(min_price_day - current_day)
current_day = min_price_day
else:
if n-current_day<=knum:
cost += ((n-current_day)-(k-knum))*data[current_day]
current_day += n-current_day
else:
if n-current_day<k:
cost += (knum-(k-(n-current_day)))*data[current_day]
knum=1+(k-(n-current_day))
current_day += 1
else:
cost += knum*data[current_day]
current_day += 1
knum=1
return cost
四、时间复杂度分析
总体结构
整个算法是一个循环结构,循环条件是当前日期小于总旅行日期,最多循环N次
主要操作
循环内部,有多处判断条件,其中比较耗时的是当下一天价格更高时,查找未来K天价格更低的日子,最坏的情况下每次都要遍历未来K天。
除了这个主要的嵌套循环操作,其他条件的判断和简单运算时间复杂度相对较低,在总体时间复杂度分析中可以忽略不计
因此,整个算法的时间复杂度是O(nk)
五、总结与收获
1.动态决策思维
在解决这个问题时,我学会了根据每天的实际情况做出动态决策。比如,根据下一天的食物价格和当前价格的比较,以及剩余天数和可携带食物量等因素,来决定是否在当天购买食物。这种决策思维让我明白在面对复杂多变的情况时,不能采用一成不变的策略,而是要灵活应对
2.贪心算法思想的运用(局部最优到全局最优)
虽然这个问题并没有完全采用贪心算法,但在判断下一天价格耕地时选择不购买食物(已有食物)或购买当天食物(没有食物),有一定贪心思想在里面。这让我对贪心算法有更深入的理解,即通过选择当前看起来最优的决策,有可能到达全局最优。同时也让我意识到,在实际应用中,要准确判断问题是否适合使用贪心算法以及如何合理地运用贪心思想