思路:
①先把前缀和求出来.
②类似于dp,当前节点为i的时候,我们要记录下i之前的连续k个数和的最大值Lmax.(这就是第一段),然后让j=i+k,让Rmax=a[j]-a[i],这样然后MAX=max(MAX,Lmax+Rmax).这样的复杂度是O(n)
看代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[210000];
int main(){
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
for(int i = 1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
ll lmax=-1e18,rmax=-1e18;
for(int i = k;i<=n-k;i++)
{
lmax=max(lmax,a[i]-a[i-k]);
rmax=max(rmax,lmax+a[i+k]-a[i]);
}
cout<<rmax<<endl;
}
return 0;
}