【2020/3/27每日一题】数学考试

数学考试
https://ac.nowcoder.com/acm/problem/15553

idea

题意是求两段不连续的区间,使其和最大。

我们预处理出原数组的前缀和后,我们求出两个数组:

:代表位置 之前最大的区间和。

:代表位置 之后最大的区间和。

最后线性 求得结果。由于数据范围较大,需要开 ,记得初始化 数组为负无穷。

时间复杂度:

code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 10;
int num[MAXN], sum[MAXN], f1[MAXN], f2[MAXN];

int32_t main() {
    int t;
    cin >> t;
    while (t--) {
        memset(sum, 0, sizeof sum);
        memset(f1, -0x3f, sizeof f1);
        memset(f2, -0x3f, sizeof f2);
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            cin >> num[i];
            sum[i] = sum[i - 1] + num[i];
        }

        for (int i = k; i <= n; i++) 
            f1[i] = max(f1[i - 1], sum[i] - sum[i - k]);
        for (int i = n - k + 1; i >= 1; i--)
            f2[i] = max(f2[i + 1], sum[i + k - 1] - sum[i - 1]);
        int res = -0x3f3f3f3f3f3f3f3f;
        for (int i = k; i + 1 <= n - k + 1; i++) res = max(res, f1[i] + f2[i + 1]);
        cout << res <<endl;
    }
    return 0;
}
全部评论

相关推荐

群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务