您的位置:首页 > 其它

算法设计分析:相邻最大矩形面积

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐