【POJ】 2559 Rectángulo más grande en un histograma

【POJ】 2559 Rectángulo más grande en un histograma

Límite de tiempo: 1000MS
Límite de memoria: 65536K

Descripción

Un histograma es un polígono compuesto por una secuencia de rectángulos alineados en una línea base común. Los rectángulos tienen anchos iguales pero pueden tener diferentes alturas. Por ejemplo, la figura de la izquierda muestra el histograma que consta de rectángulos con las alturas 2, 1, 4, 5, 1, 3, 3, medidas en unidades donde 1 es el ancho de los rectángulos:

Por lo general, los histogramas se utilizan para representar distribuciones discretas, por ejemplo, las frecuencias de los caracteres en los textos. Tenga en cuenta que el orden de los rectángulos, es decir, sus alturas, es importante. Calcule el área del rectángulo más grande en un histograma que también esté alineado en la línea de base común. La figura de la derecha muestra el rectángulo alineado más grande del histograma representado.

Aporte

La entrada contiene varios casos de prueba. Cada caso de prueba describe un histograma y comienza con un número entero n, que indica el número de rectángulos que lo componen. Puede suponer que 1 <= n <= 100000. Luego siga n números enteros h1,…, hn, donde 0 <= hi <= 1000000000. Estos números denotan las alturas de los rectángulos del histograma en orden de izquierda a derecha. El ancho de cada rectángulo es 1. Un cero sigue a la entrada del último caso de prueba.

Producción

Para cada caso de prueba, muestre en una sola línea el área del rectángulo más grande en el histograma especificado. Recuerde que este rectángulo debe estar alineado con la línea base común.

Entrada de muestra

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

Salida de muestra

8
4000

Pista

Gran entrada, se recomienda scanf.

Traducción

Rectángulo más grande del histograma

Límite de tiempo: 1000MS
Límite de memoria: 65536K

descripción

Un histograma es un polígono compuesto por una serie de rectángulos alineados en una línea de referencia común. Los anchos de los rectángulos son iguales, pero las alturas pueden ser diferentes. Por ejemplo, la imagen de la izquierda muestra un histograma, que se compone de rectángulos con alturas de 2, 1, 4, 5, 1, 3 y 3 en unidades, donde 1 es el ancho del rectángulo:

Generalmente, los histogramas se utilizan para representar distribuciones discretas, por ejemplo, la frecuencia de caracteres en el texto. Tenga en cuenta que el orden de los rectángulos, es decir, su altura, es muy importante. Calcule el área del rectángulo más grande alineado con la línea de base común en el histograma. La imagen de la derecha muestra el rectángulo alineado más grande del histograma representado.

ingresar

La entrada contiene varios casos de prueba. Cada caso de prueba describe un histograma y comienza con un número entero n, que indica el número de rectángulos que forma. Puede asumir 1 <= n <= 100000. Luego siga n números enteros h 1, ..., hn, donde 0 <= hi <= 1000000000. Estos números indican la altura de los rectángulos del histograma en orden de izquierda a derecha. El ancho de cada rectángulo es 1. Es cero después de la entrada del último caso de prueba.

Producción

Para cada salida de caso de prueba en una sola línea, especifique el área del rectángulo más grande en el histograma. Recuerde, este rectángulo debe estar alineado con la línea de base común.

Entrada de muestra

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

Salida de muestra

8
4000

Pista

Para grandes cantidades de entrada, se recomienda scanf.

Ideas

Hágalo con una pila monótona.
Guarde el ancho.
Encuentre una ubicación mayor que la altura actual.
Ancho más su ancho.
Calcula el área y compara el valor máximo.
Elimina el número mayor que el número actual.
Agrega la altura y el ancho de la posición actual.

Código

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
long long a[100010]; 
struct jgt
{
    
    
	long long wide,high;//宽,高。 
}; 
stack<jgt> s;
int main()
{
    
    
	long long n,i,ans,w;
	jgt tem;
	for(scanf("%lld",&n);n;scanf("%lld",&n))
	{
    
    
		for(ans=0,i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		a[n+1]=-1;
		for(i=1;i<=n+1;i++)
		{
    
    
			for(w=0;!s.empty()&&a[i]<=s.top().high;s.pop())//删除大于当前数的数
			{
    
    
			    w+=s.top().wide;//宽度增加 
			    ans=max(w*s.top().high,ans);//求最大面积 
			}
			tem.high=a[i],tem.wide=w+1;
			s.push(tem);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46975572/article/details/114598292
Recomendado
Clasificación