poj_3250 单调栈
2015-09-24 16:09
267 查看
题目大意
N头牛排成一列,每头牛A都能看到它前面比它矮的牛i,若前面有一个比他高的牛X,则X之前的牛j,A都无法看到。给出N头牛的高度,求出这N头牛可以看到牛的数目的总数。题目分析
画图之后,可以很容易看出是典型的单调栈问题。单调栈问题中栈元素一般有两个属性:一是牛的索引位置,二是牛的高度。每次得到一个牛index的高度height之后,都和栈顶元素进行比较,若height > stack[top].height 则直接将(新牛的高度height,新牛的索引index)入栈,否则,弹栈,直到栈顶元素stack[top].height < height,再将(新牛的高度height,新牛的索引index)入栈。在牛A被出栈的时候,可以获得牛A能够看到的牛的个数(即新入栈的牛B的索引index_b - 牛A的索引index_a)。最后记得清空栈元素来获得所有值。
实现(c++)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define MAX_COW_NUM 80005 int st[MAX_COW_NUM][2]; int gCanSeeNum[MAX_COW_NUM]; int main(){ int n; scanf("%d", &n); int height, top = -1; long long sum = 0; for (int i = 0; i < n; i++){ scanf("%d", &height); while (top >= 0 && st[top][1] <= height){ gCanSeeNum[st[top][0]] = i - st[top][0] - 1; sum += gCanSeeNum[st[top][0]]; top--; } top++; st[top][0] = i; st[top][1] = height; } while (top >= 0){ gCanSeeNum[st[top][0]] = n - st[top][0] - 1; sum += gCanSeeNum[st[top][0]]; top--; } printf("%lld\n", sum); return 0; }
相关文章推荐
- java 使用simpleDateFormat格式化日期 时间
- ExpandEnvironmentStrings函数的第二个参数的使用要注意
- 自定义添加View
- shell的本地变量和环境变量
- C# 将PPT文件转换成PDF文件
- oracle表空间操作
- java获得一个目录下的所有文件,和固定后缀的文件
- Do you know the longest English word?
- 网站相关技术探究keepalive_timeout(转)
- 四大图像库:OpenCV/FreeImage/CImg/CxImage
- 【软考】-数据结构-平衡二叉树
- Windows AIK+Imagex+DISM+U盘PE+U盘安装win7+PE
- Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置
- DevExpress GridControl Export 导出
- jz2440的字符设备驱动
- JAVA线程全局异常处理
- 驱动
- Tomcat性能参数设置
- Centos 设置不同网段的互通
- ubuntu下安装Matlab2014及破解