这个题有好几种方法,线段树、dp、前缀和
这里用的是前缀和
有简单的为啥要用难的呢?
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 2e5 + 5;
const long long INF = 0x3f3f3f3f3f3f3f3f;
long long a[maxn];
int main() {
int T;
cin >> T;
while (T--) {
int n, k;
cin >> n >> k;
for (int i = 1;i <= n;i++) {
cin >> a[i];
a[i] += a[i - 1];
}
long long ans = -INF;
long long maxnn = -INF;
for (int i = k;i + k <= n;i++) {
maxnn = max(maxnn, a[i] - a[i - k]); //第一个长度为K的区间
ans = max(ans, maxnn + a[i + k] - a[i]);//第二个长度为K的区间
}
cout << ans << endl;
}
return 0;
}
还有一点要注意:
max函数不能比较不同类型的变量,例如int 和 long long