【2020/3/27每日一题】数学考试
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; }