算法设计分析:相邻最大矩形面积
2014-05-26 16:16
253 查看
相邻最大矩形面积
时间限制:1000MS 内存限制:65535K
描述
在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。求出最大的矩形
输入格式
输入数据的第一行是一个整数 N(1≤N≤100,000),表示柱状图包含 N 个矩形。紧接着 N 个整数h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形的高度。矩形的宽度为1。
输出格式
输出一个整数S,表示以X轴为底边的最大矩形的面积。
输入样例
7
2 1 4 5 1 3 3
输出样例
8
Hint
这个问题,用简单的方法分析,寻找相邻几个矩形竖条最矮个构成的大矩形。O(n^2)的算法是比较容易实现的。需要考虑的是能否有更好搜寻办法降下这个复杂度。
不涉及分治,动规等方法。
#include"stdio.h"
int rect[100001] = {0};
int high[100001] = {0};
int wide[100001] = {0};
long count = 1;
long n;
long sum = 0;
bool Check(int list[],int k,int l,int key){
for(long i = k;i <= l;i++)
if(key == list[i])
return true;
return false;
}
void sort(){
int temp;
for(long i = 0; i < count - 1; i++)
for(long j = 0; j < count - i -1; j++)
if(high[j] > high[j + 1]){
temp = high[j];
high[j] = high[j + 1];
high[j + 1] = temp;
}
}
long unite(){
if(n == 1)return rect[1];
for(long i = 0; i < count; i++){
for(long j = 0; j <= n; j++)wide[j] = 0;
for(long j = 1; j <= n; j++){
if(rect[j] >= high[i]){
wide[j] = wide[j - 1] + 1;
sum = wide[j] * high[i] > sum ? wide[j] * high[i] : sum;
}
}
}
}
int main(){
scanf("%ld",&n);
for(long i = 1; i <= n; i++){
scanf("%d",&rect[i]);
if(i == 1)high[0] = rect[i];
else if(!Check(high,0,count - 1,rect[i]))
high[count++] = rect[i];
}
sort();
// for(int i = 0; i < count; i++)
// printf("%d ",high[i]);
printf("%ld\n",unite());
return 1;
}
时间限制:1000MS 内存限制:65535K
描述
在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。求出最大的矩形
输入格式
输入数据的第一行是一个整数 N(1≤N≤100,000),表示柱状图包含 N 个矩形。紧接着 N 个整数h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形的高度。矩形的宽度为1。
输出格式
输出一个整数S,表示以X轴为底边的最大矩形的面积。
输入样例
7
2 1 4 5 1 3 3
输出样例
8
Hint
这个问题,用简单的方法分析,寻找相邻几个矩形竖条最矮个构成的大矩形。O(n^2)的算法是比较容易实现的。需要考虑的是能否有更好搜寻办法降下这个复杂度。
不涉及分治,动规等方法。
#include"stdio.h"
int rect[100001] = {0};
int high[100001] = {0};
int wide[100001] = {0};
long count = 1;
long n;
long sum = 0;
bool Check(int list[],int k,int l,int key){
for(long i = k;i <= l;i++)
if(key == list[i])
return true;
return false;
}
void sort(){
int temp;
for(long i = 0; i < count - 1; i++)
for(long j = 0; j < count - i -1; j++)
if(high[j] > high[j + 1]){
temp = high[j];
high[j] = high[j + 1];
high[j + 1] = temp;
}
}
long unite(){
if(n == 1)return rect[1];
for(long i = 0; i < count; i++){
for(long j = 0; j <= n; j++)wide[j] = 0;
for(long j = 1; j <= n; j++){
if(rect[j] >= high[i]){
wide[j] = wide[j - 1] + 1;
sum = wide[j] * high[i] > sum ? wide[j] * high[i] : sum;
}
}
}
}
int main(){
scanf("%ld",&n);
for(long i = 1; i <= n; i++){
scanf("%d",&rect[i]);
if(i == 1)high[0] = rect[i];
else if(!Check(high,0,count - 1,rect[i]))
high[count++] = rect[i];
}
sort();
// for(int i = 0; i < count; i++)
// printf("%d ",high[i]);
printf("%ld\n",unite());
return 1;
}
相关文章推荐
- [算法]CSDN编程挑战赛之寻找直方图中面积最大的矩形
- 【算法设计与分析】6、最大字段和
- 算法分析与设计实验——最大公约数
- SCAU OJ 9715 相邻最大矩形面积
- 给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
- 程序员面试金典——解题总结: 9.18高难度题 18.13给定一份几百万个单词的清单,设计一个算法,创建由字母组成的最大矩形
- 相邻最大矩形面积的问题
- 算法设计与分析题目练习五:求最大值(遗传算法)
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 相邻最大矩形面积
- java实现算法设计与分析-最大间隙
- 算法设计与分析不定期更新的日常之最大子段和四种方法
- 高效算法设计_算法分析初步(最大连续和)
- 9715 相邻最大矩形面积 单调栈
- [算法设计与分析]3.4.2最大公约数的应用(循环移动数组元素)
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- [算法设计与分析]4.1.1递推法(兔子繁殖+最大公约数3种方法)
- 算法设计与分析之-最大子段和 (分治)
- 【算法设计与分析】最大子段和问题
- [算法]CSDN编程挑战赛之寻找直方图中面积最大的矩形