zoukankan      html  css  js  c++  java
  • 1531 山峰

    1531 山峰

     

    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 钻石 Diamond
     题目描述 Description

    Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。每个山峰的高度都是不一样的。编号为i的山峰高度为hi。

    小修从西往东登山。每到一座山峰,她就回头观望自己走过的艰辛历程。在第i座山峰,她记录下自己回头能看到的山峰数si。

    何谓“能看到”?如果在第i座山峰,存在j<k<i,hj<hk,那么第j座山峰就是不可见的。除了不可见的山峰,其余的山峰都是可见的。

    回家之后,小修把所有的si加起来得到S作为她此次旅行快乐值。现在n座山峰的高度都提供给你了,你能计算出小修的快乐值吗?

    输入描述 Input Description

    第一行一个整数n(n<=15000)。

    第i+1(1<=i<=n)行是一个整数hi(hi<=109)。

    输出描述 Output Description

    仅一行:快乐值。

    样例输入 Sample Input

    5

    2

    1

    3

    5

    9

    样例输出 Sample Output

    5

    数据范围及提示 Data Size & Hint

    说明:s1=0, s2=1, s3=2, s4=1, s5=1。

    思路:用栈模拟登山过程,如果当前山峰的高度比栈顶元素高,
    把比这个高度小的元素删除,并加入当前的高度,说明当前高度的山峰挡住了前面所有的山峰;
    如果当前山峰的高度比栈顶的元素小,入栈,这座山峰不会遮住后面的山峰。

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<stack>
     4 using namespace std;
     5 stack<int> s;
     6 int n,x,k=0;
     7 int main()
     8 {
     9     scanf("%d",&n);
    10     s.push(1000000000);   
    11     for(int i=1;i<=n;i++) 
    12     {                  
    13         k+=s.size()-1;
    14         scanf("%d",&x);
    15         while(x>s.top()) s.pop();
    16         s.push(x);
    17     }
    18     printf("%d
    ",k);
    19     return 0;
    20 }
  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6739309.html
Copyright © 2011-2022 走看看