POJ 3250 Bad Hair Day(单调栈)
2015-07-13 08:55
579 查看
Description
一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。
Input
第一行为牛数n,之后n行每行一个整数表示牛的高度
Output
输出每头牛可以看到的牛的数量
Sample Input
6
10
3
7
4
12
2
Sample Output
5
Solution
把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量。把这个数量加在一起,就可以得到最后的答案了
Code
一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。
Input
第一行为牛数n,之后n行每行一个整数表示牛的高度
Output
输出每头牛可以看到的牛的数量
Sample Input
6
10
3
7
4
12
2
Sample Output
5
Solution
把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量。把这个数量加在一起,就可以得到最后的答案了
Code
#include<cstdio> #include<iostream> using namespace std; #define maxn 80010 int cow[maxn]; int top=0; long long ans=0; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { int height; scanf("%d",&height); while(top>0&&cow[top-1]<=height)//从栈顶开始把高度小于或等于当前牛的高度的那些元素删除 top--; ans+=top;//此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量 cow[top++]=height; } printf("%lld\n",ans); return 0; }
相关文章推荐
- Linus Torvalds说那些对人工智能奇点深信不疑的人显然磕了药
- const关键字至少有下列n个作用:http://zhidao.baidu.com/link?url=Md6-Oqpx7YbJqpy_52cWGmS6exFvPpts01iDiuhvl3wpv6kNX
- 开始刷leetcode day63:Contains Duplicate III
- 开始刷leetcode day63:Contains Duplicate II
- 开始刷leetcode day63: Contains Duplicate
- mail -s发送附件
- mail -s发送附件
- static--main--单例
- 2015Summer Training #2
- 配置SSH时遇到 "Host key verification failed." 的解决方案
- lightoj 1021 Painful Bases (状压dp)
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- 启动hive报错[ERROR] Terminal initialization failed; falling back to unsupported
- Air Raid(最小路径覆盖)
- Debug Assertion Failed问题解决
- 带参数main函数
- win7下cmake编译opencv2.3.1生成opencv—createsamples.exe和opencv_haartrainingd.exe
- openCV中waitKey函数介绍
- poj 1273 Drainage Ditches(最大流入门)
- Climbing Stairs