【题目描述】
小苞准备开着车沿着公路自驾。
公路上一共有n个站点,编号为从1到n。其中站点i与站点i+1的距离为vi公里。
公路上每个站点都可以加油,编号为i的站点一升油的价格为ai元,且每个站点只出售整数升的油。
小苞想从站点1开车到站点n,一开始小苞在站点1且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进d公里。问小苞从站点1开到站点n,至少要花多少钱加油?
【输入格式】
输入的第一行包含两个正整数n和d,分别表示公路上站点的数量和车每升油可以前进的距离。
输入的第二行包含n-1个正整数v1, v2...vn-1,分别表示站点间的距离。
输入的第二行包含n个正整数a1, a2...an,分别表示在不同站点加油的价格。
【输出格式】
输出一行,仅包含一个正整数,表示从站点1开到站点n,小苞至少要花多少钱加油。
【输入样例】
5 4
10 10 10 10
9 8 9 6 5
【输出样例】
79
解题思路:1、从样例输入得知:有5个站点, 每升油能走4公里;
2、每个站点之间的距离是10公里;
3、每个加油站的油价不一样,分别是9、 8 、9 、6 、5,并且不零卖
4、最终花费79元加油
一、先计算从第一个站点到第二个站点的花费:
油9元一升,每升油跑4公里,要到达第2个站点,需要
3升油(不零卖)*4公里=12公里 12-10(站点距离)=2公里
也就是说,到达第2个站点时,车里的油还能够多出2公里
二、2号站点到3号站点,依然是10公里距离,油价是8元每升,因为车里有2公里的油
所以,我们只需要购买2升油,2*4公里=8公里 2升*8元=16元
如果是这样购买,下一个站点油价是9元一升,如果购买3升的话,就需要3*9=27元
最终的费用与样例给出的79元不一样,会超过样例数据。
所以,因为知道这个加油站的油更便宜,也可以一次购买5升油
5*8=40元 5升油*4公里=20公里 (可以跨过3号站9元的油价)
三、由于加满了油,跨过3号点(油贵)到达4号站点,车里又还有2公里油,
所以需要2升油*4公里+2公里(剩余)就能到达,2升*6元=12元
四、第一站花费27元+第二站花费40元+第四站花费12元=总花费79元
最优方案:小苞在站点 1 买了 3 升油,在站点 2 购买了 5 升油,在站点 4 购买了 2 升油。
#include <bits/stdc++.h>
using namespace std;
int n,d;//站点数,每升油能走的公里数
long long ans=0;//费用
long long v[100005];//站点距离
long long a[100005];//加油站价格
long long y[100005];//
long long youjia;//油价
main() {
scanf("%d%d",&n,&d);//输入站点,每升油走的公里数
for (int i=2;i<=n;i++){
scanf("%d",&v[i]); //输入每个加油站距离
v[i]+=v[i-1];//计算站点i到起点的距离
y[i]=ceil(1.0*v[i]/d);//从起点到当前站点的油耗
}
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);//输入每个加油站油价
}
youjia=a[1];//出发先在站点1买油
for (int i=2;i<=n;i++){
ans+=youjia*(y[i]-y[i-1]);//增加本段用油的油价
youjia=min(youjia,a[i]);//如果当前站点油比用的油便宜,换成当前站点买
}
cout<<ans;//输出总费用
return 0;
}