SDU diseño del programa pensamiento Week5- trabajo rectángulo más grande A-

El diseño del programa de pensamiento empleos Week5-

A- rectángulo más grande

Descripción

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ónQue 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.
Para cada línea de la salida de datos de prueba representa una respuesta entero.

Muestra

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

output:
8
4000

Idea

Para cada rectángulo pequeño para limitar su altura, la izquierda y la derecha extendida al máximo, rectángulo grande en este momento es conseguir que la base rectangular pequeño rectángulo se puede ampliar a un máximo de estos cálculos para todo el pequeño rectángulo Por último, teniendo el máximo que se puede obtener la respuesta.
monótona pila usada aquí pensado, con una serie de nombre monótonamente s de la pila, la pila se incrementa desde la parte inferior a la parte superior de la pila.
En primer lugar, el primer rectángulo a partir del histograma basado en una primera búsqueda comienza altura correcta inferior a su punto de decir sus puntos extremos derecho, si el rectángulo es mayor que el elemento superior, el elemento superior puso y etiquete de este elemento después de que el borde derecho, hasta que la parte superior de la pila no es mayor que el rectángulo, este rectángulo colocado en la pila, por lo que se añade a continuación que a lo largo del proceso, fuera de todo el límite derecho estará marcado rectángulo a la pila, y después del final del ciclo, aún pila espectáculos rectangulares que no tengan menos de la parte derecha de sus rectángulos límite derecho que es n.
Mira a la izquierda de la misma manera, encontrar el primer elemento de cada rectángulo menos.
Encontrado alrededor del límite de cada rectángulo se puede considerar como el rectángulo más grande.

Resumen

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 izquierdo izquierda a determinar es, el punto final derecho se puede determinar el número de la primera pequeña altura de este punto este es un pequeño número de derecha primera altura del punto
dos veces creciente monótonamente desde la parte inferior de la pila a la parte superior de pila para el procesamiento de la pila para el punto más alto de cada uno de los puntos extremos izquierdo y derecho.

Aquí podemos usar la matriz en lugar de elementos de la pila en una salida conveniente, sólo tendrá que cambiar su índice superior de la pila
Nota: 0 <= hi <= 1000 millones por lo que el uso resultado a largo tiempo de almacenamiento, de lo contrario no podría ser superado.

códigos

#include <iostream>

using namespace std;
int n;
int a[100010],L[100010],R[100010],s[100010];

int main()
{
	while (true) {
		cin >> n;
		if (n == 0)break;
		for (int i = 0; i < n; i++)
			cin >> a[i];
		long long ans = 0;
		int  top = -1;		//栈顶
		for (int i = 0; i < n; i++) {		//搜索每个元素往右第一个小于它的元素
			while (top>=0 && a[i]<a[s[top]]) {
				R[s[top]] = i;
				top--;
			}
			s[++top] = i;
		}
		while (top >=0)
			R[s[top--]] = n;
		top = -1;
		for (int i = n - 1; i >= 0; i--) {		//搜索每个元素往左第一个小于它的元素
			while (top >=0 && a[i] < a[s[top]]) {
				L[s[top]] = i;
				top--;
			}
			s[++top] = i;

		}
		while (top >= 0)
			L[s[top--]] = -1;

		for (int i = 0; i < n; i++)
			if (ans < (long long)a[i] * (R[i] - L[i] - 1))ans = (long long)a[i] * (R[i] - L[i] - 1);

		
		cout << ans << endl;
	}
}


Publicado 21 artículos originales · ganado elogios 5 · Vistas 782

Supongo que te gusta

Origin blog.csdn.net/weixin_44578615/article/details/104977224
Recomendado
Clasificación