问题描述

思路
大佬思路:非零段划分
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
int A[500005];
int cnt[10005] = {0};
int main()
{
int n;
cin >> n;
for( int i = 1; i <= n; i++)
cin >> A[i];
A[0] = A[n+1] = 0; //边界
n = unique(A,A+n+2)-A; //去掉相邻重复元素后,还有多少个元素
for( int i = 1; i < n-1; i++)
{
if( A[i-1] < A[i] && A[i] > A[i+1])
cnt[A[i]]++; //如果A[i]比两侧元素大,则当海平面为A[i]时,它可以“浮”出来,成为一个非零段
else if( A[i-1] > A[i] && A[i] < A[i+1])
cnt[A[i]]--; //如果A[i]比两侧元素小,则当海平面为A[i]时,它没法“浮”出来
}
int Max = 0;
int sum = 0;
for( int i = 10000; i > 0; i--)
{
sum+=cnt[i];
Max = max(sum,Max);
}
cout << Max;
return 0;
}
提交截图

该代码解决了一个关于数组处理的问题,通过遍历和比较数组元素,计算在消除相邻重复元素后,哪些元素可以作为非零段的分界点。程序使用了C++的STL库,包括iostream和algorithm,通过对A[i]与两侧元素的比较,更新cnt计数器,最后找出最大连续子序列的和。
1506

被折叠的 条评论
为什么被折叠?



