解题思路:我们可以把每个数想象成有着一定高度的山峰,题目的意思就是让我们选定一个海平面,让露出的山峰的数量最多,(如果多个山峰连在一起算一个山峰),在题目中我们可以发现给定的山峰的高度不超过10000,数据范围比较小,所以可以用这一点作为突破口。首先我们把相邻的高度相同的山峰当作是一个山峰,这里有利于我们后续的判断,合并之后,再来看每个山峰的状态,对于单个数值来说,它无非有下面几种情况:
‘/\’型(山峰类型):当前点作为山峰,特点是左右两边的数值都比该点的数值要小
‘\/’型(山谷类型):当前点作为山谷,特点是左右两边的数值都比该点的数值要大
'/' '\'(上下坡类型):当前的点在山坡上,特点是前一个点,当前点,后一个点三个点的数值是单调的(要么单调增,要么单调减)
接下来就是要计算每个高度对于形成山峰的贡献度,如果是山峰的类型的点,会给山峰的个数+1(说明当前高度上又新出现了一个山峰),如果是山谷类型的点,会让山峰的数量-1,(说明山谷将2个相邻的山峰连成了一个山峰),对于其他情况对山峰的数量是没有影响的,我们枚举海平面的高度,每次通过贡献值得到当前高度露出的山峰的数量,对所有高度取一个最大值即可。
上代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N =1E4+10,M=5e5+10;
int cnt[N];
int a[M];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
n=unique(a+1,a+1+n)-a-1;
a[0]=0;
a[n+1]=0;
for(int i=1;i<=n;i++)
{
int x=a[i-1],y=a[i],z=a[i+1];
if(x<y&&y>z)
cnt[a[i]]++;
if(x>y&&y<z)
cnt[a[i]]--;
}
int sum=0,maxv=0;
for(int i=N-1;i>=0;i--)
{
sum+=cnt[i];
maxv=max(maxv,sum);
}
cout<<maxv<<endl;
return 0;
}
思维还是太差了,唉