请你计算一下,这段路面上会形成多少个水坑?坑的最大深度是多少毫米?
输入格式:
输入第一行给出一个正整数 N(≤106 )。随后一行给出 N 个非负整数val,为路面横截面总左到右的单位宽度窄条的高度,以毫米为单位,0<=val<=109
输出格式:
注意:即使两个相邻的水坑有相同高度的水平面,只要之间有窄条相隔,就算是两个水坑。
输入样例:
12
1 4 2 10 7 1 2 1 8 3 1 2
输出样例:
3
7
采用从两边往中间走,更新左右围栏值,每次左向右跨越超过一个窄条或者右向左靠近超过一个窄条,cnt++,同时记录最 高值
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1000000];
int main(){
int n;
cin >> n;
for(int i=0; i<n; i++) cin >> a[i];
int left, right;
//找左边围栏下标
for(left=0; left<n-1 && a[left]<=a[left+1]; left++);//找到左围栏,即左凸起
//找右边围栏下标
for(right=n-1; right>0 && a[right]<=a[right-1]; right--);//右突起
int x, y;
int cnt = 0;
int mmax = 0;
while(1){//从两边到中间
if(left>=right) break;
x = a[left]; //会不断更新
y = a[right];
if(x<y){//左低右高,左向右走
int tmp = 0;//记录跨了多少窄条
while(left<right && a[++left]<=x){//算凹下去多少
tmp++;
if(x-a[left]>mmax) mmax = x-a[left];
}
if(tmp>0) cnt++;//有跨过窄条才算一个水坑
}
else//左高右低,右向左走
{
int tmp = 0;
while(left<right && a[--right]<=y){
tmp++;
if(y-a[right]>mmax) mmax = y-a[right];
}
if(tmp>0) cnt++;
}
}
cout << cnt << endl << mmax;
}