题目链接
题意:一套试卷有n道题,第i道题能获得的分数为a[i],选两个不连续的长度为k的区间(即[L,L+1,L+2,…,L+k-1],[R,R+1,R+2,…,R+k-1](R >= L+k)),使最终获得的分数最大。
题解:求前缀和来通过端点求这个区间内的和。又因为两个区间不能相交,维护i之前的连续k个数和的最大值maxx1,找到i之后连续k个数的和与maxx1相加使得maxx2最大
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sum[2000010],a[2000010];
int main(){
int t,n,k,flag;
ll maxx1,maxx2,temp;
cin>>t;
while(t--){
cin>>n>>k;
maxx1=-1e18,maxx2=-1e18;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
maxx1=sum[k]-sum[0];
maxx2=sum[2*k]-sum[0];
for(int i=k;i<=n-k;i++){
maxx1=max(maxx1,sum[i]-sum[i-k]);
maxx2=max(maxx2,maxx1+sum[i+k]-sum[i]);
}
cout<<maxx2<<endl;
}
return 0;
}
涉及知识点:前缀和