【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;
}