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. nodejs websocket 聊天应用

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

  2. bzoj1458 士兵占据

    1458: 士兵占据 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 685  Solved: 398 [Submit][Status][id=1458 ...

  3. Hadoop集群_Hadoop安装配置

    1.集群部署介绍 1.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesy ...

  4. 下拉刷新swipetoloadlayout的使用方法,以及自己定义头部

    <20160930---------–更新内容 回过头看自己曾经写的这个博客非常多的废话 和效果并不适合大家去使用这个好用的控件 如今整理删掉了自己写的效果, 写了个最简单的实例给一起学习的新手 ...

  5. commons io上传文件

    习惯了是用框架后,上传功能MVC框架基本都提供了.如struts2,springmvc! 可是假设项目中没有使用框架.而是单纯的使用jsp或servlet作为action,这时我们就能够使用commo ...

  6. linux命令详解:file命令

    前言 file命令可以获取多种文件类型,包括文本文件.脚本文件.源码文件.多媒体文件(音频视频)等.file是通过查看文件的头部内容,来获取文件的类型,而不像Window那样是通过扩展名来确定文件类型 ...

  7. java使用ftp局域网内多线程上传图片过慢

    多线程ftp上传文件时候,图片上传很慢,调试和查询资料发现主要在:storeFile方法 解决方案如下: FTPClient fc设置setBufferSize 可以根据内存大小适当设置大点的缓冲区: ...

  8. NSDate的具体使用(转载)

    NSDate的具体使用 时间与日期处理 主要有以下类: NSDate -- 表示一个绝对的时间点 NSTimeZone -- 时区信息 NSLocale -- 本地化信息 NSDateComponen ...

  9. CentOS 6.9 安装 ftp 服务器

    昨天为了方便上传写好的博客 .md 文件到服务器上,就在服务器搭建了一个 ftp 服务端用来上传写好的博客.很久之前我也使用虚拟机搭建过 ftp 服务器,但是时间久了,很多都忘记了.于是乎又一顿 Go ...

  10. ThinkPHP利用数据库字段做栏目的无限分类

    一直以来对cms后台的栏目管理不太理解,尤其是子栏目顶级栏目这种关系,通过网上的搜索与自己的摸索,实现方法如下(原理是利用数据库的path字段): 1.建立简单的栏目表: CREATE TABLE ` ...