这道题我的思路:
加油只在下一个站点更便宜的时候加,这样只需要遍历3次就能跑出结果。
用样例来解释一下
5 4
10 10 10 10
9 8 9 6 5
输入的时候进行一次记录,记录到8比9小,就在数组对应的位置+1。同理,在6,5的位置记录。接着跑一遍循环,算出答案。
我个人认为这道题难的不是思路,而是对于加油时有剩下油的处理。送上我的代码(样例能过,20分),有没有神犇能指点一二QAQ。
#include<iostream>
using namespace std;
const long long N=1e5+7;
long long a[N],s[N],money[N],min_money[N];
long long rem,ans;
int main(){
long long n,d; cin>>n>>d;
for(long long i=2;i<=n;i++){
cin>>a[i];
s[i]=a[i]+s[i-1];
}
cin>>money[1];
long long minn=money[1];
for(long long i=2;i<=n;i++){
cin>>money[i];
if(minn>money[i]){
minn=money[i];
min_money[i]++;
}
}
if(minn==money[1]){ //若最小值为第一站,进行一次特判
if(s[n]%d==0) cout<<s[n]/d*money[1];
else cout<<(s[n]/d+1)*money[1];
return 0;
}
long long now=0;//现在所处的位置
rem=money[1];//记录上次的钱数
for(long long i=1;i<=n;i++){
if(min_money[i]){
long long load=s[i]-now;
if(load%d==0){
ans+=load/d*rem;
now+=load;
}
else{
ans+=(load/d+1)*rem;
now+=(load/d+1)*d;
}
rem=money[i];
}
}
cout<<ans;
return 0;
}