水坑问题c++

请你计算一下,这段路面上会形成多少个水坑?坑的最大深度是多少毫米?

输入格式:

输入第一行给出一个正整数 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值