每次买够正好能到达下一个油价小于当前站点的站点的油。
预处理:用f储存每次行程需要在哪个站点购买油,用minn储存这个站点的油价。
一次循环:sum表示需要走的距离,x表示当前剩余油能够走的距离。
计算油量时需要向上取整,可以函数ceil()。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,d,v[N],a[N];
int minn[N],f[N];
long long ans;
int main()
{
cin>>n>>d;
for(int i=2;i<=n;i++)
{
cin>>v[i];
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
minn[1]=a[1],f[1]=1;
for(int i=2;i<n;i++)
{
if(a[i]<minn[i-1])
{
f[i]=i;
}
else
{
f[i]=f[i-1];
}
minn[i]=min(minn[i-1],a[i]);
}
minn[n]=minn[n-1],f[n]=f[n-1];
int i=1,x=0;
while(i<n)
{
long long sum=0;
int j;
for(j=i+1;j<=n&&f[i]==f[j-1];j++)
{
sum+=v[j];
}
sum-=x;
x=ceil(sum*1.0/d)*d-sum;
ans+=ceil(sum*1.0/d)*minn[i];
i=--j;
}
cout<<ans;
return 0;
}