分析
差分法
p足够大,所有的数都被海水淹没了,只有0个岛屿:
海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;
每当一个凹谷出现,原本相邻的两个岛屿就被这个凹谷连在一起了,岛屿数减少一个。
差分法是最简洁的解题程序。数组元素d[i]
中存储该元素被替换为0时,划分数变化的差分值。最大值则只需要从其前缀和(程序中实际为后缀和)中找出最大值就是所要的结果。
程序代码中,STL算法函数unique()
用来去除相邻重复的元素。
语句a[0] = a[n + 1] = 0;
用来设置边界值,起辅助计算作用,可以简化程序代码。
AC 代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
int a[500005];
int d[10005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[0]=a[n+1]=0;
n+=2;
int x=unique(a,a+n)-a-1;//返回结束重复数字的下标
for(int i=1;i<x;i++){//遍历一遍a前面的值
//记录对应a值的凸顶,如果p=凸顶,说明有岛屿显露出来了,需要++
if(a[i]>a[i-1]&&a[i]>a[i+1])
d[a[i]]++;
//记录对应a值的凹底 如果p=凹地 那么说明岛屿连起来了,就需要--
else if(a[i]<a[i-1]&&a[i]<a[i+1])
d[a[i]]--;
}
int ans=0,sum=0;
for(int p=10000;p>0;p--){//水平面下降
sum+=d[p];
ans=max(ans,sum);
}
cout<<ans<<endl;
}