A- rectángulo más grande

tema:

Para un histograma, encuentra la mayor área rectangular en el histograma. Por ejemplo, la siguiente altura de la imagen en el histograma de izquierda a derecha son 2, 1, 4, 5, 1, 3, 3, 1 que son de ancho, el rectángulo más grande está sombreada.
Aquí Insertar imagen Descripción

Entrada:

Que comprende una pluralidad de conjuntos de datos de entrada. Cada conjunto de datos se representa mediante un número entero n de pequeña histograma rectangular, se puede asumir que 1 <= n <= 100000. entonces el siguiente n enteros H1, ..., hn, que satisface 0 <= hi <= 1000000000. Estos histograma de izquierda a derecha de la representación digital de cada pequeño rectángulo de altura, la anchura de cada rectángulo pequeño es 1. Los datos de prueba a 0 al final.

Salida:

Para cada línea de la salida de datos de prueba representa una respuesta entero.

Ejemplo de entrada:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Salida de muestra:

8
4000

análisis Tema:

Requieren un área máxima rectangular en el histograma, de acuerdo con un área conocida del rectángulo a la altura de la fórmula premisa debe requerir la anchura del rectángulo, y el rectángulo en la altura histograma [l, r] sujeto a la sección de altura mínima, la anchura rectangular = l-r + 1. Entonces, la pregunta clave es cómo determinar el adecuado l, r como un rango.

  • Para hacer todo más grande del rectángulo, la altura a un mínimo se determina como r en l.

  • Del mismo modo, si se determina la altura del rectángulo, entonces el punto de extremo izquierdo debe ser más a la izquierda, a la derecha el punto correcto, la única posible área máxima de un rectángulo.

  • punto final izquierdo se puede determinar como el primer número pequeño de puntos a la izquierda altura a la misma.

  • Se puede determinar como el extremo derecho de este primer punto altura número correcto pequeña.

  • pila monótono de la pila a los elementos de la pila de pila monótona inferior.

    • monótonamente creciente pila se encuentra a la izquierda / derecha el primer elemento es más grande que el elemento actual.
    • pila monótonamente decreciente se encuentra a la izquierda / derecha el primer elemento es menor que el elemento actual.
    Respectivamente monótonamente decreciente monótonamente creciente pila y se obtiene la pila en cada punto es alta alrededor del punto final.

WA muchas veces, debido a que el tipo de datos, la propiedad de altura en el intervalo 0 <= hi <= 1000000000, aunque no más allá de la gama de gama int hi, pero en la zona en el proceso de obtención y h (l-r + 1 ) multiplicado gama int estallar, será WA, que tiene que ser una operación de fuerte en el que la convierte tipo largo de largo, donde tengo la altura y área de convertir al tipo de largo tiempo. Formado larga correspondencia larga LLD Oh, no hay que olvidar (se me olvidó la adición de una desgracia WA)

código:

#include<iostream>
#include<stdio.h> 
#include<stack>
using namespace std;
const int maxn=1e5+100;
long long  L[maxn],R[maxn],w[maxn],a[maxn];
int n;
void solve()//找出各点右端点
{	
	stack<int> sa; 
	int l=1;int r=0;
	for(int i=1;i<=n;i++)
	{
		while(sa.size()>0 &&a[sa.top()]>a[i] )//单调递减栈找出右边第一个比当前元素小的元素
		{
			R[sa.top()]=i-1;
			sa.pop(); 
		} 
		sa.push(i);
	}
	while(sa.size()>0)//单调栈里的元素赋区间最右端点
	{
		R[sa.top()]=n;
		sa.pop();
	}
}
void solve1()//找出各点左端点
{	

	stack<int> sa; 
	int l=1;int r=0;
	//while(n--)
	for(int i=n;i>=1;i--)
	{
		while(sa.size()>0 &&a[sa.top()]>a[i] )//单调递减栈找出左边第一个比当前元素小的元素
		{
			L[sa.top()]=i+1;
			sa.pop(); 
		} 
		sa.push(i);
	}
	while(sa.size()>0)//单调栈里的元素赋区间最左端点
	{
		L[sa.top()]=1;
		sa.pop();
	}
}

int main()
{	
	//int n;//直方图小矩形个数 
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
		{
			return 0;
		}	
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		solve(); 
		solve1();
		long long ans=0;
		for(int i=1;i<=n;i++)//计算面积
		{
			w[i]=a[i]*(R[i]-L[i]+1);
		}
		for(int i=1;i<=n;i++)//找出最大面积
		{
			if(w[i]>ans)
			{
				ans=w[i];
			}
		}
		printf("%lld\n",ans);
	} 
	return 0;	
} 
Publicado 21 artículos originales · ganado elogios 0 · Vistas 1096

Supongo que te gusta

Origin blog.csdn.net/qq_43746837/article/details/105012659
Recomendado
Clasificación