empleos week5-

A - el rectángulo más grande

Significado de las preguntas:

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:
entrada que comprende una pluralidad de conjuntos de datos. 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.


ideas:

Si se determina la altura del rectángulo, luego a la izquierda de un cierto punto más a la izquierda, que es el primer número pequeño dejado este punto de la altura, y el punto extremo derecho puede determinar la altura del primer número pequeño de este punto a la derecha, que se puede utilizar monótona acerca de si la pila se desplazan a través de la matriz de almacenamiento de gama alta usando, por cada punto atravesado una vez para cada punto, entonces el ciclo actual se determina el punto donde la pila es mayor que el punto más alto igual a la alta corriente, si se elimina entonces la pila después del final del ciclo para determinar si la pila está vacía, si está vacío, entonces demostrar que el punto izquierdo en el extremo izquierdo. De lo contrario la parte superior de la pila actual. El punto es entonces inserta en la pila. operación de punto de interrupción derecho, también, sólo el comienzo de la cola de la cabeza.
Nota: Debido a que el tamaño del área de datos excede el rango puede ser de conversión largo long int


código:

#include<iostream>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
stack<int> s;
int a[100010], l[100010], r[100010];
int main()
{
	int n;
	
	while (~scanf("%d",&n))
	{
		long long int area=0;
		if (n == 0) exit(0);
		for (int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
		}
		while (!s.empty())
			s.pop();
		for (int i = 1; i <= n; i++)
		{
			while (!s.empty() && a[s.top()] >= a[i])
				s.pop();
			if (s.empty()) 
				l[i] = 0;
			else 
				l[i] = s.top();
			s.push(i);
		}
		while (!s.empty())
			s.pop();
		for (int i = n; i >=1; i--)
		{
			while (!s.empty() && a[s.top()] >= a[i])
				s.pop();
			if (s.empty()) 
				r[i] = n+1;
			else 
				r[i] = s.top();
			s.push(i);
		}
		for (int i = 1; i <= n; i++)
			area = max(area, (long long int)a[i] * (r[i] - l[i]-1));
		cout << area << endl;
	}
	return 0;
}

Gato mágico del TT - B

Significado de las preguntas:

Gracias a la ayuda de todos la semana pasada, que finalmente consiguieron un lindo gato. Pero nunca pensé que esto es un gato mágico.
Un día, un gato mágico decidió investigar la capacidad de TT, dándole un problema. N ciudades que se seleccionan del mapa del mundo, a [i] denota el i-ésimo valor de los activos propiedad de la ciudad.
Entonces, este gato mágico llevará a cabo varias acciones. Cada ronda de selección [l, r] ciudades dentro del alcance, y aumentar el valor de sus activos c. Por último, dado el valor de los activos de cada uno de la ciudad después de la operación q.
¿Me pueden ayudar a encontrar?
La ENTRADA:
La primera línea contiene dos números enteros nq
gestión y cantidad de la ciudad.
La segunda línea contiene una secuencia de elementos: un número entero de a1, a2, ..., an
q seguido filas, cada fila representa una sola operación. I-ésima fila comprende tres enteros L, R y C, para la i-ésima operación.
salida:
impresión de n enteros a1, a2, ..., uno por línea, ai debe ser igual al valor final de los bienes de la i-ésima ciudad.


ideas:

Esta pregunta es relativamente simple, sección de sustracción se piensa que es la matriz de diferencia original en una matriz, un único punto será cambiado para modificar la zona, que es [l, r] en el intervalo de -> punto l + c, r + 1 punto -c
entonces los prefijos individuales finales modificados y el resultado final obtenido.


código:

#include<iostream>
#include<cstring>
using namespace std;
long long a[1000001],b[1000001];
int main()
{
    ios::sync_with_stdio(false);
    int n, q;
    int r, l, c;
    a[0] = 0;
    cin >> n >> q;
    memset(b, 0, sizeof(b));
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++)
    {
        b[i] = a[i] - a[i - 1];
    }
    for (int i = 1; i <= q; i++)
    {
        cin >> l>> r>> c;
        b[l] += c;
        b[r + 1] -= c;
    }
    for (int i = 1; i <= n; i++)
    {
        a[i] = a[i-1]+b[i];
        cout << a[i] << " ";
    }
    return 0;
}

C - balance de cadena

Significado de las preguntas:

Una cadena de longitud n s, que contiene sólo la 'Q', 'W', 'E', 'R' cuatro tipos de caracteres.
Si tanto el número de n / 4, que se equilibra con una serie de cuatro clases de personajes aparecen en la cadena.
S puede ser ahora período continuo de los mismos subcadenas de longitud reemplazar cualquier cadena que contiene sólo cuatro caracteres, por lo que se convierte en una cadena equilibrada, de forma alternativa preguntó longitud mínima de la subcadena?
Si s ha equilibrado salidas 0 .

Entrada:
línea que representa una cadena de caracteres dada s

Output
Un entero que representa la respuesta


ideas:

Escala de préstamos para mantener doble puntero, el general pidió respuestas a una serie continua, los dos extremos de la gama no puede ser una dirección clara, está claro que esta pregunta es esta cadena se puede utilizar como un continuo, que puede ser utilizado para determinar si el pie endeudamiento para cumplir con los requisitos . Primer conjunto (L, R) (inicial L = R = 0), respectivamente, para atravesar la primera cadena, respectivamente contar el número de conteos por cuatro QWER. Si los cuatro cargos son iguales, se determina que la cadena equilibrar directamente, si no quieren esperar, determina en primer lugar el primer carácter, y el recuento de caracteres de -1. Se hace circular, de modo que mediante la sustitución de las cuatro cargos son iguales max = max (sum1, SUM2, sum3, sum4).
Entonces ver [L, R] es el número de secuencia restante es GRATIS = (R + L-1 ) - [(Max-sum1) + (Max-SUM2) + (Max-sum3) + (Max-sum4)] n es mayor que o igual a 0 es un múltiplo de cuatro.
Si se va a cumplir con los requisitos, L ++, o no cumple con los requisitos de R ++; Hasta R <n hasta la fecha;


código:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string s;
int sum1 = 0,sum2=0,sum3=0,sum4=0;
int l=0, r=0;

int main()
{
	int count = 1000000;
	ios::sync_with_stdio(false);
	cin >> s;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == 'Q')
			sum1++;
		if (s[i] == 'W')
			sum2++;
		if (s[i] == 'E')
			sum3++;
		if (s[i] == 'R')
			sum4++;
	}
	if (sum1 == sum2 &&sum2== sum3&&sum3== sum4)
	{
		cout << 0 << endl;
		exit(0);
	}
	if (s[0] == 'Q')
		sum1--;
	if (s[0] == 'W')
		sum2--;
	if (s[0] == 'E')
		sum3--;
	if (s[0] == 'R')
		sum4--;
	while (1)
	{
		int MAX1 = max(sum1, sum2), MAX2 = max(sum3, sum4);
		int MAX = max(MAX1, MAX2);
		int TOTAL = r- l + 1;
		int FREE = TOTAL - ((MAX - sum1) + (MAX - sum2) + (MAX - sum3) + (MAX-sum4));
		if (FREE >= 0 && FREE % 4 == 0)
		{
			count = min(TOTAL, count);
			if (s[l] == 'Q')
				sum1++;
			if (s[l] == 'W')
				sum2++;
			if (s[l] == 'E')
				sum3++;
			if (s[l] == 'R')
				sum4++;
			l++;
		}
		else
		{
			if (r + 1 >= s.size()) break;
			r++;
			if (s[r] == 'Q') 
				sum1--;
			if (s[r] == 'W') 
				sum2--;
			if (s[r] == 'E')
				sum3--;
			if (s[r] == 'R')
				sum4--;

		}


	}
	cout << count << endl;
	return 0;
	
	
	
}

D - ventana deslizante

Significado de las preguntas:

ZJM tiene una longitud de n número de columnas y un tamaño de una ventana k, la ventana puede ser movido hacia atrás y adelante en las columnas. ZJM ahora quieren saber de izquierda a derecha en una ventana deslizante, la ventana cada vez que el valor máximo y el valor mínimo, respectivamente, ¿Qué ejemplo:
el número de columnas es [13-1-35367], donde k es igual a 3.
la posición de la ventana el valor máximo valor mínimo
[1. 3 -1] -3 3. 5. 6. 7 -1 3..
1 [3 -.. 13]. 6. 7 -3. 3 53
. 1. 3 [-1-35] -3. 5. 7. 6. 3
. 1. 3-1 [-353] -3. 7. 5. 6
. 1. 3 -1 3 [53 . 6]. 6. 7. 3
. 1. 5. 3 -3 -1 [. 3. 6. 7]. 3. 7
la entrada
es de entrada dos líneas. La primera línea de dos números enteros n y k son el tamaño y la longitud de las series de ventanas correderas, 1 <= k <= n <= 1000000. La segunda fila ha representa n un número entero de columnas de ZJM.
Salida de
salida de dos líneas. La primera línea de salida de cada posición de la ventana deslizante de izquierda a derecha, el valor mínimo de la ventana deslizante. La segunda línea es el máximo.


ideas:

Desde la ventana y para mantener los valores máximos y mínimos tomados de cada ventana, primera a la k-1 para mantener una cola de monótonamente creciente, a continuación, a partir de la k-ésimo, k de n para seguir manteniendo una cola monótonamente creciente, el elemento de cola que pertenece a el proceso de la ventana, y el mantenimiento actual, si el elemento no pertenece a la ventana actual, los elementos del estallido de la primera plantilla, el primer equipo es el elemento mínimo de cada ventana, guardarlos en otra matriz. Buscando la máxima cola se convierte simplemente en una monótona creciente monótonamente decreciente de mantenimiento a la cola, y el otro sin cambios.


código:

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
deque<int> q;
int a[1000001],mi[1000001],ma[1000001];
int main()
{
	int n, k;
	scanf("%d %d",&n,&k);
	for (int i = 1; i <= n; i++)
		scanf("%d",&a[i]);
	for (int i = 1; i <= k - 1; i++)
	{
		while (q.size() && a[q.back()] > a[i])
			q.pop_back();
		q.push_back(i);
	}
	for (int i = k; i <= n; i++)
	{
		while (q.size() && a[q.back()] > a[i])
			q.pop_back();
		q.push_back(i);
		while (q.size() && (i - q.front()) >= k)
			q.pop_front();
		mi[i] = a[q.front()];
	}
	while (!q.empty())
	{
		q.pop_back();
	}
	for (int i = 1; i <= k - 1; i++)
	{
		while (q.size() && a[q.back()] < a[i])
			q.pop_back();
		q.push_back(i);
	}
	for (int i = k; i <= n; i++)
	{
		while (q.size() && a[q.back()] < a[i])
			q.pop_back();
		q.push_back(i);
		while (q.size() && (i - q.front()) >= k)
			q.pop_front();
		ma[i] = a[q.front()];
	}
	for (int i = k; i <=n ; i++)
		printf("%d ",mi[i]);
	printf("\n");
	for (int i = k; i <=n; i++)
		printf("%d ",ma[i]);
	return 0;
}
Publicado siete artículos originales · ganado elogios 0 · Vistas 121

Supongo que te gusta

Origin blog.csdn.net/weixin_44465341/article/details/105105451
Recomendado
Clasificación