CCF CSP 编程题目和解答-----试题名称: 最大的矩形 -------201312-3

问题描述 
试题编号: 201312-3 
试题名称: 最大的矩形 
时间限制: 1.0s 
内存限制: 256.0MB 
问题描述: 
问题描述     在横轴上放了 n 个相邻的矩形,每个矩形的宽度是 1,而第 i(1 ≤ i ≤ n)个矩形的高度是 hi。这 n 个矩形构成了一个直方图。例 如,下图中六个矩形的高度就分别是 3, 1, 6, 5, 2, 3。 
 
 CCF CSP 编程题目和解答-----试题名称: 最大的矩形 -------201312-3_第1张图片
 
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴 平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积
是 10。 
 CCF CSP 编程题目和解答-----试题名称: 最大的矩形 -------201312-3_第2张图片
输入格式     第一行包含一个整数 n,即矩形的数量(1 ≤ n ≤ 1000)。     第二行包含 n 个整数 h1, h2, … , hn,相邻的数之间由空格分 隔。(1 ≤ hi ≤ 10000)。hi是第 i 个矩形的高度。 
输出格式     输出一行,包含一个整数,即给定直方图内的最大矩形的面积。 
样例输入 6 3 1 6 5 2 3 
样例输出 10 

/**解题思路:

本题我的解题思路是从最高的矩形i=highest开始,算出以该高度的最大矩形的面积

然后依次i=i-1,计算以新的i为高度的最大矩形面积

直到算出高度为1的最大矩形面积

然后比较得出整个直方图中最大的矩形面积

**/

//以下代码是本人根据自己的理解编写,因为无法拿到原始测试数据所以不能保证100%正确,有更好思路的大佬欢迎指正。

#include
#include
#include
#include
#include
#include
#include


using namespace std;



int main()
{
	int n;
	cin >> n;
	vector all(n, 0);
	int highest = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> all[i];
		if (all[i] > highest)
			highest = all[i];
	}	
	long long maxSize = 0;
	for (int i = highest; i >= 0; i--)
	{
		int tem[1000] = { 0 };//tem[x]表示第x个矩形是不是高于i(当前的上限值)
		
		for (int j = 0; j < all.size(); j++)//循环找出所有高度大于当前i的矩形,并在tem数组中标记出来
		{
			if (all[j] >= i)
				tem[j] = 1;
		}
		
		int maxContinuous = 0;//最长连续超过i的矩形的个数
		
		int tempcon = 0;//临时存放每一块连续的矩形的个数
		bool flag = false;
		
		for (int j = 0; j < 1000; j++)//循环找出最长的连续的高于当前i的矩形个数
		{
			if (tem[j] == 1)
			{
				if (flag)   //如果不是当前块第一个大于i的矩形
					tempcon++;//当前连续个数+1
				else         
				{
					flag = true; //如果是当前块第一个大于i的矩形,设置标志位
					tempcon++;
				}
			}
			else//出现了一个小于i的矩形
			{
				flag = false;  //设置标志位
				if (tempcon > maxContinuous)//判断当前连续块的大小是不是最大
				{
					maxContinuous = tempcon;
					
				}
				tempcon = 0;

			}
		}


		long long tempsize = maxContinuous*i;//计算以i为高度的最大矩形面积
		
		if (tempsize > maxSize)  //如果当前面积大于之前的最大面积
		{
			maxSize = tempsize;
		}
		


	}


	cout << maxSize << endl;


}


你可能感兴趣的:(编程随笔,CCF,CSP题目)