算法课上老师提出的一个小问题,试着解决一下。
问题描述:
从A开到B,一路有n个加油站:1,2,3,...,n。(A地为0,B地为n+1)
D[i]表示i-1和i两加油站之间的距离
P[i]表示第i个加油站的油价(rmb/km)(P[n+1]=0)
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
P[i] | 5 | 6 | 2 | 4 | 3 | 7 | 0 |
D[i] | 0 | 4 | 3 | 5 | 2 | 3 | 1 |
求如何加油才能让总汽油支出最低
我的想法:
首先,一辆车从A开到B会经历途中的这些所有加油站,也就是说总油钱是
x1 D[1] + x2 D[2] + x3 D[3] + ... + x6 D[6]
其中xi代表第i段距离的油钱开销,取决于走这一段用的油是在哪个加油站加的,它可能等于上一站的油价P[i-1],也可以等于上好几站的油价P[i-k]。
总之,D[i]的部分是确定的,我们的操作空间在于要让D[i]前面的系数是最小的。
最好的情况是,如果我们能直接从油价最低的那个加油站买到全程所需的油,那么我们的总开销一定是最小的。但是实际上我们只能一站一站地走,所以我们每遇到一个油价更便宜(比当前用油便宜)的站,就买那一站的油,要一直够开到下一个更便宜的加油站,这样逐步让D[i]前面的系数降低。直到我们遇到了一个最便宜的店,一口气加满,开到目的地。
过程就是这样,对于程序,我们可以先设置一个变量present,记录当前我们用的油的价位,然后遍历整个p数组,遇到更便宜的店就把present换成更低的油价。
偷个懒,只针对这道题写了一下:
运行结果:
萌新能力有限,有什么问题欢迎指正!谢谢大家!