题意 给定一个长度为n的序列 选择两段长度为k的子序列和的最大值
有一个类似的题目,是选择两个点,思路是遍历,记录下过程中的最大值,答案便是最大值加上当前的数的最大值
这题也类似,遍历过程中记录长度为k的最大值,答案是最大值加上当前区间取最大值
重点是两段不能相交
#include<iostream>
using namespace std;
int t,n,a[200010],k;
int main()
{
cin>>t;
while(t--)
{
long long a[200010]={0},ans=-1e18,maxx=-1e18;
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i],a[i]+=a[i-1];
for(int i=k,j=i+1;j+k-1<=n;i++,j++)
{
maxx=max(maxx,a[i]-a[i-k]);
ans=max(ans,maxx+a[j+k-1]-a[j-1]);
}
cout<<ans<<endl;
}
}
京公网安备 11010502036488号