首页 > 其他 > 详细

3247:xzc哥哥爬山……

时间:2019-07-18 20:56:03      阅读:109      评论:0      收藏:0      [点我收藏+]

xzc哥哥爬山……

描述

又到了旅游的好季节,每到这个时候,xzc就会带着他的朋友去游玩,作为xzc的室友,wzf跟着xzc一起出去。他们一行人翻山越岭,逍遥自在望着连绵起伏的群山,xzc突然提出了一个很奇怪的问题,假设这些山都是在同一条直线上的,那么他从A山上向右望,只要右边的山的高度严格的比这座山小,那么从A山上就看的见该山。
比如说有6座山,他们从左到右的高度一次是10 3 7 4 12 2 ,那么从高度为2的山向右看只能看到0座山
从高度为12的山向右看就可以看到高度为2的这1座山,因为12>2,从高度为4的山向右看只能看到0座山,
因为高度12的山挡住了他的视线,他就看不到比他高度低的山了。同理从高度为7的山上能看到1座山,
从高度为3的山上只能看到0座山,从高度为10的山上能看到3座山,所以最后3+1+0+0+1+0=5,
即为我们要求的答案。

输入

有多组测试数据,每组测试数据中:第一行为一个正整数n<=80000, 接下了n行,每行一个正整数,表示山的高度,按照从左到右的顺序每座山的高度<=10^8

输出

看到山的总数

样例输入

6
10 3 7 4 12 2
3
3 1 2

样例输出

5
2

代码

技术分享图片
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=80005;
stack<int> s;
int main()
{
        int n,m;
        int x;
        while(~scanf("%d",&n))
        {
          LL sum=0;
          for(int i=1;i<=n;i++)
          {
           scanf("%d",&x);
           while(!s.empty()&&s.top()<=x)
           {
               s.pop();
               sum+=s.size();
           }
           s.push(x);
         }
         while(!s.empty())
         {
            s.pop();
            sum+=s.size();
         }
         printf("%lld\n",sum);
        }
}
View Code

 

3247:xzc哥哥爬山……

原文:https://www.cnblogs.com/llhsbg/p/11209841.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!