Barrera óptima (pila)

barrera óptima

tema:

Descripción del problema:
El terreno del país M es desigual. Se proporciona una matriz para representar la altitud Hi de N montañas distribuidas uniformemente en una determinada latitud en este país. Se sabe que hay una torre de vigilancia en la cima de cada montaña. Si hay dos centinelas Están ubicados respectivamente en las montañas i y j (i<j). Si y solo si la montaña donde están ubicados es más alta que todas las montañas entre ellas, estos dos centinelas pueden monitorearse entre sí. La capacidad defensiva del país M es el número de pares de centinelas que se monitorean entre sí. El País H ha estado observando durante mucho tiempo al País M. El emperador del País H espera que los magos negros puedan colocar una enorme barrera entre dos montañas en el País M. Los centinelas del País M no pueden monitorearse entre sí a través de la barrera. El emperador quiere que le digas la ubicación óptima para la colocación de la barrera. Eres el asesor militar más confiable del emperador. Ahora necesita que le ayudes a calcular la ubicación óptima para la colocación de la barrera y la reducción máxima del poder defensivo.

Entrada:
La primera línea contiene un número entero positivo T (T≤20).
Para cada conjunto de datos, la primera línea contiene un número entero positivo n (2≤n≤50000).
Los siguientes n enteros positivos diferentes, H1, H2, H3,..., Hn (0≤Hi≤109) representan respectivamente la altitud de cada montaña en la sección transversal.
(Los datos leídos son relativamente grandes, se recomienda usar scanf en lugar de cin para leer)
Para el 60% de los datos, n≤500
Para el 80% de los datos, n≤5000
Para el 100% de los datos, n≤50000

Salida:
cada conjunto de datos genera una línea con la forma de "Caso #N: XC", N representa el enésimo conjunto de datos actual (a partir de 1) y, en este momento, la reducción es C. Si hay varias soluciones que reducen la cantidad a C, entonces se genera la solución correspondiente a la X más pequeña.

ingresar:

2
3
2 1 3
5
4 5 2 6 3

Producción:

Case #1: 2 2
Case #2: 3 2

Idea: abra dos matrices, prefijo y sufijo respectivamente, y use la pila para mantener la cantidad de pares centinela almacenados en la matriz cada vez.

Finalmente, use: prefijo[n]-(prefijo[i-1]+sufijo[i]) para recorrer las respuestas de la simulación;

Echemos un vistazo al código:

#include<bits/stdc++.h>
using namespace std;
int a[101010],q[101010],h[101010];
int main()
{
	int t;
	cin>>t;
	for(int k=1;k<=t;k++)
	{
		memset(q,0,sizeof(q));//多实例,每次都要初始化
		memset(h,0,sizeof(h));
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		stack<int> st;
		for(int i=1;i<=n;i++)//前缀
		{
			q[i]=q[i-1];//计算往前看的最大防御力前缀和
			int ans=0;
			while(!st.empty()&&st.top()<a[i])//遇到比自己高的就开始清栈
			{
				ans++;
				st.pop();
			}
			if(!st.empty())
			q[i]+=ans+1;//把当前最高的也加上
			else
			q[i]+=ans;
			st.push(a[i]);
		}
		while(!st.empty())//先清栈,再计算后缀
		{
			st.pop();
		}
		for(int i=n;i>0;i--)//后缀
		{
			h[i]=h[i+1];
			int ans=0;
			while(!st.empty()&&st.top()<a[i])
			{
				ans++;
				st.pop();
			}
			if(!st.empty())
			h[i]+=ans+1;
			else
			h[i]+=ans;
			st.push(a[i]);
		}
		int maxx=0,j=0;
		for(int i=1;i<=n;i++)
		{
			if(q[n]-(q[i-1]+h[i])>maxx)
			{
				maxx=q[n]-(q[i-1]+h[i]); //遍历找最大
				j=i;
			}
		}
		cout<<"Case #"<<k<<": "<<j<<" "<<maxx<<endl;
	}
	return 0;
}

Artículo siguiente El problema de cálculo de MoonLight

Supongo que te gusta

Origin blog.csdn.net/weixin_74088105/article/details/131747734
Recomendado
Clasificación