牛客 数学考试(思维)

先求一遍前缀和,然后从n-k+1,倒序枚举,并且同时维护一个后面的最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
priority_queue<ll> q;
ll a[N];
ll s[N];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        int i;
        for(i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            s[i]=s[i-1]+a[i];
        }
        ll res=-1e18;
        ll tmp=-1e18;
        for(i=n-k+1;i>=1;i--){
            if(i-k-1<0)
            break;
            tmp=max(s[i+k-1]-s[i-1],tmp);
            res=max(res,tmp+s[i-1]-s[i-1-k]);
        }
        cout<<res<<endl;
    }
}
View Code

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/12922977.html