https://ac.nowcoder.com/acm/problem/15553 链接:https://ac.nowcoder.com/acm/problem/15553 来源:牛客网
今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完, 他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间, 即[L,L+1,L+2,....,L+k-1],[R,R+1,R+2,...,R+k-1](R >= L+k)。
** 思路:由于为长度固定是k并且要求快速求解所有合法区间的最大值所以可以使用前缀和来快速求得区间和: 之后再依次寻找两个不重叠的两个较大的区间这里我用的是res,ans来记录前一个不重叠合法区间的最大值和总的值 代码如下: **
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5+10;
typedef long long ll;
ll a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i],a[i]+=a[i-1];
ll res=-1e18,ans=-1e18;
for(int i=k;i+k<=n;i++)
{
res=max(res,a[i]-a[i-k]);
ans=max(ans,res+a[i+k]-a[i]);
}
cout<<ans<<endl;
}
return 0;
}