链接:https://www.nowcoder.com/acm/contest/96/H
来源:牛客网
今天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)。
输入描述:
第一行一个整数T(T<=10),代表有T组数据接下来一行两个整数n,k,(1<=n<=200,000),(1<=k,2k <= n)接下来一行n个整数a1,a2,...,an,(-100,000<=ai<=100,000)
输出描述:
输出一个整数,qwb能获得的最大分数
示例1
输入
2
6 3
1 1 1 1 1 1
8 2
-1 0 2 -1 -1 2 3 -1
输出
6
7
思路:选出两段和最大的长度为K的区间,预处理每个点前k个值的和。两段相加,不断更新。
Code:
链接:https://www.nowcoder.com/acm/contest/96/H
来源:牛客网
今天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)。
输入描述:
第一行一个整数T(T<=10),代表有T组数据接下来一行两个整数n,k,(1<=n<=200,000),(1<=k,2k <= n)接下来一行n个整数a1,a2,...,an,(-100,000<=ai<=100,000)
输出描述:
输出一个整数,qwb能获得的最大分数
示例1
输入
2
6 3
1 1 1 1 1 1
8 2
-1 0 2 -1 -1 2 3 -1
输出
6
7
Code:
#include
#define LL long long
using namespace std;
const int AX = 2e5+666;
LL a[AX];
LL sum[AX];
LL b[AX];
int main(){
int T;
cin >> T;
int n,k;
while( T-- ){
cin >> n >> k ;
for( int i = 1 ; i <= n ; i ++ ){
cin >> a[i];
}
for( int i = 1 ; i <= n ; i++ ){
sum[i] = sum[i-1] + a[i];
}
for( int i = k ; i <= n ; i ++ ){
b[i] = sum[i] - sum[i-k];
}
LL MAX1 = -1e18 , MAX2 = -1e18;
for( int i = 2 * k ; i <= n ; i++ ){
if (b[i - k] > MAX1)
MAX1 = b[i - k];
if (MAX1 + b[i] > MAX2)
MAX2 = b[i] + MAX1;
}
cout << MAX2 << endl;
}
return 0;
}