大佬们救救,这个哪里有问题?只能35pts。代码的注释全部写上了
查看原帖
大佬们救救,这个哪里有问题?只能35pts。代码的注释全部写上了
938991
zdrtgb159753楼主2025/2/1 09:16
#include<bits/stdc++.h>
using namespace std;
long long n,x,l,maxx,pre,post;
const int N = 1e5+10;
//a数组为记录值,b数组为记录以a[i]结尾的小于x的最长连续子序列长度
long long a[N], b[N];
long long res;
bool flag;

int main(){
    cin>>n>>x;
    int i = 1;
    for(i = 1; i <= n; i++) cin>>a[i];
    for(i = 1; i <= n; i++){
        //当a[i]小于x时,更新b和post,其中post为这段子序列替换成x能增长的值
        if(a[i] < x){
            flag = false;
            b[i] = b[i-1]+1;
            post = post+x-a[i];
        }else{
            b[i] = 0;
            //pre记录前一个post,如果post大于pre,说明替换这段是能获得更大的值的,所以进行替换,更新maxx和l,以便最后确定更新的地方和长度
            if(post > pre && !flag){
                maxx = b[i-1];
                l = i-1;
                pre = post;
                flag = true;
            }
            post = 0;
        }
    }
    //防止更新的位置是在最后的部分
    if(post > pre && !flag){
        maxx = b[i-1];
        l = i-1;
        pre = post;
        flag = true;
    }
    //进行更新
    for(i = l - maxx +1; i <= l; i++) a[i] = x;
    //更新后求和
    for(i = 1; i <= n; i++){
        res += a[i];
    }
    printf("%lld",res);
    return 0;
}
2025/2/1 09:16
加载中...