思路分享&求神犇看下错在哪
查看原帖
思路分享&求神犇看下错在哪
1113533
xu_duo楼主2024/7/23 00:25

这道题我的思路:

加油只在下一个站点更便宜的时候加,这样只需要遍历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;
}


2024/7/23 00:25
加载中...