模拟
枚举去重后的每个数字
1.若当前数字化为0,当前数字左边和右边都是非0数字,那么会增加一个非零段
2.若当前数字化为0,当前数字左边和右边都是0,那么就会减少一个非零段
3.若当前数字化为0,左边和右边只存在一个非0数字,那么不会影响非零段个数
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v;
int num;
map<int, vector<int>> m;
// 为了方便维护索引,在数组的最前面和最后面加一个0
v.emplace_back(0);
for (int i = 0; i < n; i++) {
cin >> num;
v.emplace_back(num);
}
v.emplace_back(0);
int cnt = 0;
bool f = true;
// 统计初始情况的非零段
for (int i = 0; i < v.size(); i++) {
if (v[i])
m[v[i]].emplace_back(i);
if (v[i]) {
f = false;
} else {
if (!f)
cnt++;
f = true;
}
}
int ret = cnt;
for (auto it:m) {
for (auto iter:it.second) {
if (v[iter - 1] && v[iter + 1]) {
cnt++;
} else if (!v[iter - 1] && !v[iter + 1]) {
cnt--;
}
v[iter] = 0;
}
ret = max(ret, cnt);
}
cout << ret;
return 0;
}