题目链接:https://codeforces.com/contest/1343/problem/C
alternative看了半天最后还是去了百度翻译…
题意是说在整个数组中选取一个alternative(正负交替)的子数组,使其元素和最大。
简单模拟,从前往后遍历,遇到符号变换则取最大值,加到结果中。(要注意给的第四个样例越界了,所以要用long long)
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200010];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
ll mx = -1, mn = -1000000001;
ll res = 0;
cin >> a[0];
if(a[0] > 0) {
mx = max(mx, a[0]);
} else {
mn = max(mn, a[0]);
}
for(int i = 1; i < n; i++) {
cin >> a[i];
if(a[i] > 0) {
if(a[i - 1] < 0) {
res += mn;
mn = -1000000001;
}
mx = max(mx, a[i]);
} else {
if(a[i - 1] > 0) {
res += mx;
mx = -1;
}
mn = max(mn, a[i]);
}
}
if(a[n - 1] < 0) {
res += mn;
} else {
res += mx;
}
cout << res << endl;
}
return 0;
}