链接: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能获得的最大分数
输入描述:
第一行一个整数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 3
1 1 1 1 1 1
8 2
-1 0 2 -1 -1 2 3 -1
输出
6
7
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 <bits/stdc++.h> #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; }