SDUT 3661 MoutainTop (单调栈) -- 解题报告

原创 2016年08月30日 18:32:02

题面

MoutainTop
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
金石山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。编号为i的山峰高度为hi。每个山峰的高度两两不同
小木示从西向东依次爬过这n个山峰,到每一个山峰的山顶的时候,他都会往西边眺望,并且会记录下自己能看到的山峰的个数。
(比如说小木示现在在4号山峰,前四号山峰的高度分别为9,4,5,1。他现在能看到的山峰个数就是2,因为第二个山峰被第三个山峰挡住了)
严格的来说,小木示在i位置的时候,对于一个山峰j (j < i),如果不存在一个山峰k满足hj < hk (j < k < i)。则山峰j是可见的。
小木示把自己记录的山峰的个数加和作为这次爬山的快乐值,现在给你n个山峰的高度,求小木示的快乐值。

Input
多组输入,首先输入一个n(1<=n<=10^6),表示山峰的个数。 接下来一行n个数,表示对应山峰的山峰的高度(1<=h<=10^6)。

Output
输出小木示的快乐值

Example Input
4
1 6 5 1

Example Output
4

Author
JueChen

所需基础

单调栈

解题思路

这道题是小木示出的题,学过单调栈的同学不难看出是一道裸题(我当时怎么就没看出来啊 QAQ)。解题思路其实很容易理解,我们维护一个栈来记录当前可见的山,读入山高数据之后,把栈中所有比当前山高小的元素全部弹出(道理不难理解,一旦出现了高山,那么下一次计算数量的时候,比此山矮的山必然会被挡住,也就不会被计算到,因此可以把它们安全弹出),然后再将当前山高入栈。由于本轮读入的山高只会影响到下一次计数,因此我们可以在每轮输入前进行计数累加。
另外,关于单调栈,再推荐一道类似题目: POJ 3250 Bad Hair Day

参考代码

#include <cstdio>
#include <stack>
using namespace std;

int main(int argc, char const *argv[]) {
    int n, data;
    while(~ scanf("%d", &n)) {
        scanf("%d", &data);
        stack<int> s;
        s.push(data);
        long long sum = 0;
        while(--n) {
            sum += s.size();
            scanf("%d", &data);
            // 弹出比当前山高小的山
            while(!s.empty() && s.top()<data) {
                s.pop();
            }
            s.push(data);
        }
        printf("%lld\n", sum);
    }

    return 0;
}
版权声明:by bLue. 本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVa10635 Prince and Princess ACM解题报告(LCS与LIS的转化+单调栈+二分查找代替DP)

这题给出一个长p+1和一个长q+1的序列,然后找他们的LCS,由于数据量比较大,有62500多,并且两个序列中都没有重复出现的数字,即可给每个数字标号,给第一序列标号乘1,2,3,4,。。。。,p+1...

解题报告代码 sdut2107

  • 2011年07月29日 19:19
  • 734B
  • 下载

SDUT - 2017年寒假集训 阶段测试赛3(个人) -- 解题报告

比赛 ID: 2016注:本题解可能存在部分 C++ 的参考代码,如果你是 C 使用者,出现不认识的头文件时,若是 c 开头的,一般可以通过去掉开头的 c 然后在末尾添加 .h 来转换成 C 的头文件...

SDUT 3648 迷の有序序列 (动态规划) -- 解题报告

题面 迷の有序序列 Time Limit: 1000MS Memory Limit: 65536KB Problem Description n个数,每次可以选择其中一个数移...

SDUT 3460 Fighting_小银考呀考不过四级 (递推) -- 解题报告

题面 Fighting_小银考呀考不过四级 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 四级考试...

SDUT 3100 动态规划? (动态规划) -- 解题报告

题面 动态规划? Time Limit: 1000ms Memory limit: 65536K 题目描述 动态规划作为《运筹学》的一个分支,被广泛的用于解决较为复杂的经...

SDUT 3513 皮卡丘的梦想 (二进制+线段树) -- 解题报告

题面 皮卡丘的梦想 Time Limit: 1000ms Memory limit: 65536K 题目描述 一天,一只住在 501 的皮卡丘决定发奋学习,成为像 Lei...

SDUT 3068 为了相同的前缀-方程式计算 (数学) -- 解题报告

题面 为了相同的前缀-方程式计算 Time Limit: 1000ms Memory limit: 65536K 题目描述 输入a,b,c,找出所有符合下列方程的x,且x...

SDUT 3014 硬币问题 (动态规划) -- 解题报告

题面 硬币问题 Time Limit: 1000ms Memory limit: 65536K 题目描述 芳芳有N(1...

SDUT 3554 无尽走廊 (动态规划) -- 解题报告

题面 无尽走廊 Time Limit: 1000MS Memory limit: 65536K 题目描述 2006年,我们可以称之为“帆“船年。一艘艘友谊的小船都在这一年翻掉...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SDUT 3661 MoutainTop (单调栈) -- 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)