题意 给定一个长度为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; } }