小苞准备开着车沿着公路自驾。
公路上一共有 nn 个站点,编号为从 11 到 nn。其中站点 ii 与站点 i+1i+1 的距离为 vivi 公里。
公路上每个站点都可以加油,编号为 ii 的站点一升油的价格为 aiai 元,且每个站点只出售整数升的油。
小苞想从站点 11 开车到站点 nn,一开始小苞在站点 11 且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进 dd 公里。问小苞从站点 11 开到站点 nn,至少要花多少钱加油?
输入格式
输入的第一行包含两个正整数 nn 和 dd,分别表示公路上站点的数量和车每升油可以前进的距离。
输入的第二行包含 n−1n−1 个正整数 v1,v2…vn−1v1,v2…vn−1,分别表示站点间的距离。
输入的第三行包含 nn 个正整数 a1,a2…ana1,a2…an,分别表示在不同站点加油的价格。
输出格式
输出一行,仅包含一个正整数,表示从站点 11 开到站点 nn,小苞至少要花多少钱加油。
输入输出样例
输入 #1复制
5 4 10 10 10 10 9 8 9 6 5
输出 #1复制
79
说明/提示
【样例 1 解释】
最优方案下:小苞在站点 11 买了 33 升油,在站点 22 购买了 55 升油,在站点 44 购买了 22 升油。
【样例 2】
见选手目录下的 road/road2.in 与 road/road2.ans。
【数据范围】
对于所有测试数据保证:1≤n≤1051≤n≤105,1≤d≤1051≤d≤105,1≤vi≤1051≤vi≤105,1≤ai≤1051≤ai≤105。
测试点 | n≤n≤ | 特殊性质 |
---|---|---|
1∼51∼5 | 88 | 无 |
6∼106∼10 | 103103 | 无 |
11∼1311∼13 | 105105 | A |
14∼1614∼16 | 105105 | B |
17∼2017∼20 | 105105 | 无 |
- 特殊性质 A:站点 11 的油价最低。
- 特殊性质 B:对于所有 1≤i<n1≤i<n,vivi 为 dd 的倍数。
- 题解答案:
- #include <bits/stdc++.h>
using namespace std;
long long a[100005],b[100005],v[100005];
int main(){
long long n,d;
cin>>n>>d;
for(int i=1;i<n;i++){
cin>>a[i];
v[i]=v[i-1]+a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
long long t=0;
long long sum=0;
long long sy=0;
long long s=1,dis=0,end=s+1;
while(s!=n){
bool f=0;
for(int i=s+1;i<=n;i++){
if(b[i]<b[s]){
f=1;
end = i;
break;
}
}
if(f==0)end=n;
dis=v[end-1]-v[s-1];
t=ceil(1.0*(dis-sy)/d);
sum+=t*b[s];
s=end;
sy=sy+t*d-dis;
}
cout<<sum;
return 0;
}