题解
题目描述:
链接: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)。
input:
第一行一个整数T(T<=10),代表有T组数据
接下来一行两个整数n,k,(1<=n<=200,000),(1<=k,2k <= n)
接下来一行n个整数a1,a2,…,an,(-100,000<=ai<=100,000)
output:
输出一个整数,qwb能获得的最大分数
解题思路:
求区域最大和的问题,先用前缀和处理一下。我们可以先确定一个长度为k的区域,一边维护这个区域的最大和,一边去遍历另一个区域的最大和。注:1e5*2e5>1e10,所以用long long。
代码如下:
#include <bits/stdc++.h>
using namespace std;
long long a[200001];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
int i;
for(i=1; i<=n; i++)//前缀和处理一下
{
cin>>a[i];
a[i]+=a[i-1];
}
long long mx=-1e18;
long long ans=-1e18;
for(i=k;i+k<=n;i++)//遍历搜索第二个区域
{
mx=max(mx,a[i]-a[i-k]);//维护第一个区域的最大值
ans=max(ans,mx+a[i+k]-a[i]);//维护最终的答案
}
cout<<ans<<endl;
}
return 0;
}