【题目描述】
小苞准备开着车沿着公路自驾。
公路上一共有 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 解释】
最优方案下:小苞在站点 1
买了 3
升油,在站点2
购买了 5
升油,在站点 4
购买了 2
升油。
【数据范围】
对于所有测试数据保证:1≤n≤10^5
,1≤d≤10^5
,1≤vi≤10^5
,1≤ai≤10^5
。
【思路】贪心加模拟
#include <bits/stdc++.h>
using namespace std;
const long long MAXN=1e5+5;
long long a[MAXN],v[MAXN];
long long n,d,last=0,ans=0,road=0;
double oil=0.0;
int main()
{
cin>>n>>d;
for(long long i=0;i<n-1;i++)
cin>>v[i];
for(long long i=0;i<n;i++)
cin>>a[i];
for(long long i=0;i<n;i++){
if(a[i]<a[last]||i==n-1){
if(oil*d<road){
ans+=ceil((road-oil*d)/d)*a[last];//基础数学公式
oil+=ceil((road-oil*d)/d)-road*1.0/d;
}
else{
oil-=road*1.0/d;
}
road=0;
last=i;
}
road+=v[i];
}
cout<<ans;
return 0;
}