这是一个被判定为“中等”难度的题目,但我认为如果没有提前学习或了解过相关的方法和策略,特别对于新手来讲,该题是极具挑战性的,今天我就把我对这题的思考、解析和感悟分享给大家。
- 首先,题目内容如下:小R正在计划一次从地点A到地点B的徒步旅行,总路程需要
N天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以购买食物进行补充。然而,每个补给站的食物每份的价格可能不同,并且小R最多只能同时携带K份食物。现在,小R希望在保证每天都有食物的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗? 接下来是三个测试样例, 样例1:
输入:
n = 5 ,k = 2 ,data = [1, 2, 3, 3, 2]
输出:9
样例2:
输入:
n = 6 ,k = 3 ,data = [4, 1, 5, 2, 1, 3]
输出:9
样例3:
输入:
n = 4 ,k = 1 ,data = [3, 2, 4, 1]
输出:10
- 我们来思考一下,每天的食物价格都不尽相同,按照常规思路,肯定是在食物价格便宜的时候买满可携带的数量,在食物价格贵的时候少买甚至不买,但必须满足每天都有食物,而且可以知道,第一天必须购买食物,最后一天食物必须消耗完,貌似我们已经知道这N天的食物价格的高低,可以比较这些天的食物价格,再衡量自己可携带的数量,做出花费最少的规划,那么我们就从第一个测试样例的输入和输出情况,来演绎一下一般方法的思路过程,总路程需要5天,每天可携带2份食物,这5天食物的价格依次是1、2、3、3、2,那么我们在第一天购买2份食物,在第二天购买1份食物,在第三天或第四天购买1份食物,最后一天购买1份食物,刚好能满足要求,输出是2+2+3+2=9,结果也是对的,不难发现,每次都是先结算购买食物的结果,再结算每天消耗一份食物的结果。我们再来看k=3的情况,总路程需要6天,食物价格依次是4、1、5、2、1、3,过程是在第一天购买1份食物,在第二天购买3份食物,在第四天购买2份食物,刚好满足要求,输出是4+3+2=9,结果也正确,其实已经能够感觉到,当k>2时,在用代码去实现需要考虑的情况是比较复杂的,你在某一天需要买的食物数量,是需要综合考虑可携带的最大数量、往后几天的价格,还有保证最后一天要吃完,所以单纯根据样例从一般演绎的思路是很棘手的。
- 现在我们通过一种“先买先吃,买贵退款”的思路来看这个问题,即每天我们都把食物买满,秉持先吃便宜的,贵的等退款的原则,先满足当天食物消耗的需求,到了下一天,我们比较当天和昨天的食物价格,如果昨天的贵了,我们就把买多的退了(吃掉的就算了,但一定要先吃便宜的),到了最后一天,我们再把多余的食物退了,这样就简单明了多了,用代码也容易实现。以样例2为例,第一天买满,-12元;第二天发现第一天买贵了,把吃剩下的两份退了,+8元,再买满,-3元;第三天补满,-5元;第四天发现第三天的又贵了,退了,+5元,再补满,-4元,第五天发现又买贵了,退了,+4元,再补满,-3元,第六天也就是最后一天,吃一份,剩下一份退了,+1元,总花费:-12+8-3-5+5-4+4-3+1=-9元,即花费9元,输出9,满足要求。