题目链接
思路:用前缀和维护一个数组sum,并枚举每个k范围内的元素和的值,sum[i]-sum[i-k],更新每次的区间最大值,同时枚举下一个k区间内的sum值,更新最大值,输出即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=2*1e5+10;
ll a[N];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];}
ll maxn=-1e18,ans=-1e18;//这里用-INF赋值居然不行,改一下-1e18居然就可以了,why??
for(int i=k;i+k<=n;i++){
maxn=max(maxn,a[i]-a[i-k]);
ans=max(ans,maxn+a[i+k]-a[i]);
}
cout<<ans<<endl;
}
return 0;
}