博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codevs 1531 山峰
阅读量:6324 次
发布时间:2019-06-22

本文共 1511 字,大约阅读时间需要 5 分钟。

codevs 1531 山峰
题目描述 
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。

维护一个单调递减的栈stack[]。

设当前元素为x,栈顶元素为k,栈顶指针为top,ans为到目前为止所能看到的山峰总数

如果x<k,ans+=top,x入栈。这座山比栈顶存的山低,那么由于栈从底部到顶部递减,所以此时栈内有几座山,就能看到几座山。

如果x=k,ans+=top,这座山和栈顶的山高度相同,设栈顶能看到y座山,在这座山就能看到y+1座山(加上的是栈顶这座山),也就是栈内所有的山。

如果x>k,1、ans+=top这座山比栈顶的山高,由于栈从栈底到栈顶单调递减,所以这座山比栈内所有的山高,可以看到所有的山。

             2、由于这座山很高,所以会遮挡后面的视线,所以要维护栈的单调性,也就是从栈顶开始,如果这座山比栈顶的山高,栈顶退栈,直至退到这座山比栈顶的山低为止,x再入栈。

由此可以看出,对于每一个位置,都可以看到当前栈内所有的山,所以直接枚举,ans+=top

#include
#include
using namespace std;int stack[15001],top;int n,ans,x;int init()//读入优化,也可以直接输入 { int x=0;char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} return x;}int main(){ n=init(); for(int i=1;i<=n;i++) { x=init(); ans+=top; if(x
stack[top-1])//这座山比栈顶的山高 { while(top&&x>stack[top-1]) top--;//维护单调性 stack[top++]=x; } } printf("%d",ans); }

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6218630.html

你可能感兴趣的文章
高度决定视野眼界决定世界
查看>>
Linux进程间通信之消息队列
查看>>
shell脚本路径写法的注意点
查看>>
Testng生成的测试报告乱码解决办法
查看>>
vim快速入门
查看>>
大杂烩 -- 单向链表是否存在环或是否相交
查看>>
java中重载与重写的区别
查看>>
mybatis mapper xml文件配置resultmap时,id行和result行有什么区别?
查看>>
关键字检索高亮标出-javasript/jQuery代码实现
查看>>
Vijos P1785 同学排序【模拟】
查看>>
人物关系网络图可视化
查看>>
关于ADO.Net SqlConnection的性能优化
查看>>
docker安装及加速配置
查看>>
Android系统剪切板
查看>>
[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值
查看>>
如何来展开項目
查看>>
CSS变量variable
查看>>
MRF能量优化
查看>>
JForum 源码分析
查看>>
【nginx】nginx:利用负载均衡原理实现代码的热部署和灰度发布
查看>>