LC的课后辅导

发布时间: 2015年9月19日 21:42   时间限制: 1000ms   内存限制: 256M

描述

有一天,LC给我们出了一道题,如图:

这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积。

输入

多组测试数据 每组测试数据的第一行为n(0 <= n <= 100), 表示图形有n个小矩形构成 接下来一行输入n个整数h1, h2...hn(0 <= hi <= 1000), 表示每个小矩形的高度 n为0时程序结束

输出

仅输出一行表示面积的最大值

样例输入1 复制

7
2 1 4 5 1 3 3
4
1000 1000 1000 1000
0
样例输出1

8

4000

思路:开两个数组分别记录每一个矩形以他为中心所能达到的左右长度,然后面积就是h*(r-l+);这里要注意的是如果该矩形比上一个或后一个矩形要小,则上一个矩形所能达到的区间,该矩形一定可以达到,
ac代码:
#include<stdio.h>
int main()
{ int a[];
int n,max,i;
while(scanf("%d",&n)!=EOF)
{
if(n==)
break;
for(i=;i<=n;i++)
scanf("%d",&a[i]);
int l[],r[];
l[]=;
r[n]=n;
int t;
for(i=;i<=n;i++)
{ t=i;
while(t>&&a[i]<=a[t-])
t=l[t-];
l[i]=t;
}
for(i=n-;i>=;i--)
{ t=i;
while(t<n&&a[i]<=a[t+])
t=r[t+];
r[i]=t;
}
int max=-;
for(i=;i<=n;i++)
{ if((r[i]-l[i]+)*a[i]>max)
max=(r[i]-l[i]+)*a[i];
}
printf("%d\n",max);}
return ;
} 最近在接触单调栈,又用栈实现了一下,这里维护一个单增栈,那么如果要进栈的数不能直接入栈,说明当前栈顶比他大,就说明它可以延伸,一直到可以进栈为止,也就是说通过维护单增栈我们一定可以找到左面第一个比他小的和右面第一个比他小的; 还有这里因为矩形的高度可能相同,所以当栈为空时说明可以延伸到头或者尾; #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define N 100010
using namespace std;
int a[N],l[N],r[N];
int main()
{ int n,i;
while(scanf("%d",&n)!=EOF){
if(n==)
break;
stack<long long >st;
while(!st.empty())
st.pop();
l[]=;
st.push();
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
{
if(a[st.top()]>=a[i])
{ while(!st.empty()&&a[st.top()]>=a[i])
{
st.pop();
}
if(st.empty())
l[i]=;
else
l[i]=st.top()+;
st.push(i);
}
else
{ l[i]=i;
st.push(i);
} }
while(!st.empty())
st.pop();
r[n]=n;
st.push(n);
for(i=n;i>=;i--)
{
if(a[st.top()]>=a[i])
{ while(!st.empty()&&a[st.top()]>=a[i])
{
st.pop();
}
if(st.empty())
r[i]=n;
else
r[i]=st.top()-;
st.push(i);
}
else
{
r[i]=i;
st.push(i);
} }
//for(i=1;i<=n;i++)
//printf("%d %d\n",l[i],r[i]);
long long ans=;
for(i=;i<=n;i++)
ans=max(ans,(long long)(r[i]-l[i]+)*a[i]);
printf("%lld\n",ans);
}
return ;
}

QDUOJ LC的课后辅导 单调递增栈的更多相关文章

  1. qduoj LC的课后辅导

    描述 有一天,LC给我们出了一道题,如图: 这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积. 输入 多组测试数据每组测试数据的第一行为n(0 <= n ...

  2. POJ - 2796 Feel Good 单调递增栈+前缀和

    Feel Good Bill is developing a new mathematical theory for human emotions. His recent investigations ...

  3. nyoj 单调递增子序列(二)

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长 ...

  4. HD1160FatMouse's Speed(最长单调递增子序列)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  6. 【LCS,LIS】最长公共子序列、单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  7. nyoj 17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  8. NYOJ17,单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf.长度为4 输入 第 ...

  9. [LeetCode] Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

随机推荐

  1. canvas转盘抽奖的实现(二)

    本篇是<canvas转盘抽奖的实现(一)>的另一种实现方法,主要通过css3的transform以及transition过渡来实现.     // ' + r + '等奖'; } draw ...

  2. MySQL Infobright 数据仓库快速安装笔记[转]

    [文章作者:张宴 本文版本:v1.1 最后修改:2010.05.18 转载请注明原文链接:http://blog.zyan.cc/infobright/] Infobright是一个与MySQL集成的 ...

  3. Hadoop文档 索引

    Hadoop中文文档 http://hadoop.apache.org/docs/r1.0.4/cn/index.html Hadoop资料整理 http://www.itpub.net/thread ...

  4. ubuntu安装rpm格式文件方法(转载)

    red hat 系统用rpm格式的文件安装软件   Debian系列用deb格式的文件安装软件 ubuntu安装软件是用deb格式的文件安装,ubuntu对于rpm格式的文件安装软件是: 先将rmp格 ...

  5. 简化Android的startActivityForResult调用

    一个是解决在onActivityResult 中判断requestCode的问题,第二个是让调用代码的地方就知道我是如何处理对方activity 的返回的. 首先我们有一个ResultActivity ...

  6. EasyDarwin流媒体云平台:EasyCamera开源摄像机接入海康威视摄像机实时视频

    本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52755298 EasyCamera接收云平台实时 ...

  7. 基于EasyDarwin实现幼儿园监控类项目

    移动互联网越来越普及,幼儿园监控类的项目也越来越多,如何能够以最低的成本.最快的速度搭建一套幼儿园监控类的平台成了许多开发者的需求,那么我们今天就来简单探讨一下如何基于EasyDarwin实现一套幼儿 ...

  8. 关于js开发的小问题

    一.开发当中经常会动态拼接html,当然为了简便性好多人直接就是使用内联事件: $('#td1').html( '<a href="#" onclick="app. ...

  9. Mac下文件编码转换

    参见:http://bbs.feng.com/read-htm-tid-107633.html 使用: sudo find *.txt -exec sh -c "iconv -f GB180 ...

  10. HDU3605 Escape —— 二分图多重匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...