#include<bits/stdc++.h>
using namespace std;
int n,d;
const int maxn = 100010;
int v[maxn],b[maxn],f,f1;
double f2;//站点距离和油价 f:记录到了哪个站点 f2:记录当前站点油价
void read(){
for(int i = 0; i < n-1; i++) cin>>v[i];
for(int i = 0; i < n; i++) cin>>b[i];
f1 = b[0];
}
int find(int p[]){//用于寻找这个站点往后的第一个油价比它少的站点
for(int i = f; i < n-1; i++){
if(p[i] < f1){
return i;
}
}
return -1;
}
using namespace std;
int main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
cin>>n>>d;
read();
f1 = b[0];
if(find(b) == -1){//若第一个站点为最低价,直接走到终点
int s = 0;
for(int i = 0; i < n-1; i++) s+=v[i];
s = ceil(s*1.0/d);
cout<<s*b[0];
return 0;
}
int sum = 0;
while(f!=n){
int s = 0;
if(find(b) == -1){//若此站点为最低价,直接走到终点
for(int i = f; i < n-1; i++) s+=v[i];
s -= floor(1.0*f2*d);
s = ceil(s*1.0/d);
cout<<sum+s*b[f];
return 0;
}
for(int i = f; i <= find(b); i++) s+=v[i];
s -= floor(1.0*f2*d);
s = ceil(s*1.0/d);
sum += s*b[f];
f1 = b[f];
f2 = s - (v[f]/d*1.0);
f = find(b);
}
cout<<sum;
}
这个代码的贪心法看看能不能行(0pts,如果思路正确那就是我小数的问题)