D - Left Right Operation

发布时间:2024年01月21日

思路:

1、求前缀和

2、从后往前遍历,把某个后缀都变为R,记录最多让数组和减小多少

3、从前往后遍历,把某个前缀都变为L,记录最小答案(前i个变为L,后面的n-i个数让减小最多的后缀变为R)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    ll N,L,R;cin>>N>>L>>R;
    vector<ll> A(N);
    for(int i=0;i<N;i++) cin>>A[i];
    vector<ll> sum(N+1),ma(N+1);
    for(int i=1;i<=N;i++){
        sum[i]=sum[i-1]+A[i-1];
    }
    for(int i=N-1;i>=0;i--){
        ma[i]=(sum[N]-sum[i])-R*(N-i);
        ma[i]=max(ma[i],ma[i+1]);
    }
    
    ll ans=(1LL<<61);
    
    ll l=0;
    
    for(int i=0;i<=N;i++){
        ans=min(ans,l+sum[N]-sum[i]-ma[i]);
        l+=L;
    }
    
    cout<<ans<<endl;
}

文章来源:https://blog.csdn.net/weixin_73550568/article/details/135724452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。