#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void) {
int i, j, k, n, m, maxmax = -999999999, cnt, x, y, z;
cin>>n;
vector<int> t(n);
for(i = 0; i < n; i++) scanf("%d", &t[i]);
vector<int> f(t), pt(n, 0), ng(n, 0);
pt[0] = t[0] > 0? 1:0;
ng[0] = t[0] > 0? 0:1;
for(i = 1; i < n; i++) {
if(t[i] > 0) {
pt[i] = pt[i-1] + 1;
if(ng[i-1] > 0) ng[i] = ng[i-1] + 1; // 下面<0的判断已经经历过1次,也就是前面出现过一次负号,此时即使是>0,ng也要累加的,防止后续有<0的出现,导致乘积突变
else ng[i] = 0; // 前面还没有<0出现
} else if(t[i] < 0) {
ng[i] = pt[i-1] + 1;
if(ng[i-1] > 0) pt[i] = ng[i-1] + 1; // 已经出现了偶数次的<0,此时是正数>0,要赋值给pt的
else pt[i] = 0; // 前面还没有<0出现
} else {
pt[i] = 0;
ng[i] = 0;
}
}
vector<int>::iterator kk = max_element(pt.begin(),pt.end());
cout<<kk[0]<<endl;
return 0;
}
根据上面的super-programmer给出来的题解,负号就需要不停的累加,正号可以来自负负得正,也可以来自纯正号的,负号需要在正号的基础上累加。

京公网安备 11010502036488号