[牛客每日一题3月27日][NC15553]数学考试

题目链接

题意大致为求两个长度为$k$的区间和最大,如果枚举第一个区间的起点$L1$,则只需要在$[L1+k,n-k+1]$中找一个位置$X$满足$[X,X+k-1]$的和最大。

所以可以预处理:$sum[i]$表示$[i,i+k-1]$的值,$Max[i]$表示$[i,n-k+1]$中的$sum$最大值。最后枚举起点$L1$,则答案为$max(sum[L1]+Max[L1+k])$

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
const ll inf = 1e18;
ll a[maxn],p[maxn],Max[maxn];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            p[i]=0;
            Max[i]=-inf;
        }
        for(int i=1;i<=k;i++)
            p[1]+=a[i];
        for(int i=2;i<=n-k+1;i++)
            p[i]=p[i-1]+a[i+k-1]-a[i-1];
        for(int i=n-k+1;i>=1;i--)
            Max[i]=max(Max[i+1],p[i]);
        ll ans =-inf;
        for(int i=1;i<=n-2*k+1;i++)
            ans =max(ans,p[i]+Max[i+k]);
        printf("%lld\n",ans);

    }
}

 

posted @ 2020-03-26 15:08  祈梦生  阅读(82)  评论(0编辑  收藏