数学考试

链接: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 <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;
}


猜你喜欢

转载自blog.csdn.net/frankax/article/details/79950856