栈的使用
2016-04-08 20:47
169 查看
对栈有了一定得了解后,做了这道题:
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。
这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。
对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
基本思路就是第一次输入矩形的高以后,并将其记录在一个结构体,同时在结构体记录矩形的宽,虽然是1,
但也需要记录,后面要用到,将此结构体变量入栈。然后每输入一个高并记录在结构体变量temp中,判断他
是否大于栈顶的高,若大于等于就入栈,否则,也就是小于栈顶的高,就计算栈顶的面积,并将栈顶的宽累
加到一个变量暂记为total_w,然后让其出栈,再次与栈顶比较,直到temp中的高大于等于栈顶元素的高后停
止,关键来了,将累加的total_w的值赋给temp的宽,目的可以在代码中体现出来。然后经过上面的重复输入,
判断,最后栈里剩下的肯定是递增排列的元素,挨个判断即可。通过代码,可能会理解的更深刻。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
using namespace std;
struct node
{
int h;
int w;
};
int main()
{
int n, totalw, maxn=0, cura;
node temp;
stack < node > s;
cin >> n;
for(int i=1; i<=n; ++i)
{
cin >> temp.h;
temp.w=1;
if(s.empty())
s.push(temp);
else
{
cura=totalw=0;
if(temp.h>=s.top().h)
s.push(temp);
else
{
while(!s.empty())
{
if(temp.h<s.top().h)
{
totalw+=s.top().w;
cura=totalw*s.top().h;
if(cura>maxn)
maxn=cura;
s.pop();
}
else
{
break;
}
}
temp.w+=totalw;
s.push(temp);
}
}
}
totalw=cura=0;
while(!s.empty())
{
totalw+=s.top().w;
cura=s.top().h*totalw;
if(cura>maxn)
maxn=cura;
s.pop();
}
cout << maxn << endl;
return 0;
}
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。
这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。
对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
基本思路就是第一次输入矩形的高以后,并将其记录在一个结构体,同时在结构体记录矩形的宽,虽然是1,
但也需要记录,后面要用到,将此结构体变量入栈。然后每输入一个高并记录在结构体变量temp中,判断他
是否大于栈顶的高,若大于等于就入栈,否则,也就是小于栈顶的高,就计算栈顶的面积,并将栈顶的宽累
加到一个变量暂记为total_w,然后让其出栈,再次与栈顶比较,直到temp中的高大于等于栈顶元素的高后停
止,关键来了,将累加的total_w的值赋给temp的宽,目的可以在代码中体现出来。然后经过上面的重复输入,
判断,最后栈里剩下的肯定是递增排列的元素,挨个判断即可。通过代码,可能会理解的更深刻。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
using namespace std;
struct node
{
int h;
int w;
};
int main()
{
int n, totalw, maxn=0, cura;
node temp;
stack < node > s;
cin >> n;
for(int i=1; i<=n; ++i)
{
cin >> temp.h;
temp.w=1;
if(s.empty())
s.push(temp);
else
{
cura=totalw=0;
if(temp.h>=s.top().h)
s.push(temp);
else
{
while(!s.empty())
{
if(temp.h<s.top().h)
{
totalw+=s.top().w;
cura=totalw*s.top().h;
if(cura>maxn)
maxn=cura;
s.pop();
}
else
{
break;
}
}
temp.w+=totalw;
s.push(temp);
}
}
}
totalw=cura=0;
while(!s.empty())
{
totalw+=s.top().w;
cura=s.top().h*totalw;
if(cura>maxn)
maxn=cura;
s.pop();
}
cout << maxn << endl;
return 0;
}
相关文章推荐
- Log类简单的使用
- Mercurial使用笔记(3)
- 使用hexo在github上搭建博客
- 【学习笔记】3D图形核心基础精炼版-7:stage3D实战-范例工程1
- 算法训练 最大的算式(动态规划)
- [2] CSS&javascript(基本语法及使用)
- 例解 autoconf 和 automake 生成 Makefile 文件
- 单点触控
- 【Error】InterfaceError (0, '')
- 2004: [Hnoi2010]Bus 公交线路
- AFNetworking3同步请求另类解决方案(阻塞线程)
- Could not get a resource from the pool
- CF251D Two Sets 异或高斯消元找最优解
- 动态连通性:union-find算法(常规搜索、树状触点搜索、加权树搜索的算法分析)
- 第三方微信授权登录的iOS代码分析
- 局域网跨机访问WCF服务出错本机访问正常的问题
- Kubernetes和OpenStack到底是什么关系?
- Node.js中,获取req请求的原始IP
- AndroidStudio 进行单元测试
- 4、MongoDB集合里面文档的插入,查找,更新操作