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); } }
原文:https://www.cnblogs.com/llhsbg/p/11209841.html