Optimale Barriere (Stapel)

optimale Barriere

Thema:

Beschreibung des Problems:
Das Gelände des Landes M ist uneben. Es wird ein Array angegeben, um die Höhe Hi der N-Berge darzustellen, die in diesem Land gleichmäßig auf einem bestimmten Breitengrad verteilt sind. Es ist bekannt, dass sich auf der Spitze jedes Berges ein Wachturm befindet . Wenn es zwei Wächter gibt Sie befinden sich jeweils auf den Bergen i und j (i<j). Nur wenn der Berg, auf dem sie sich befinden, höher ist als alle Berge zwischen ihnen, können sich diese beiden Wächter gegenseitig überwachen. Die Die Verteidigungsfähigkeit des Landes M ist die Anzahl der Wächterpaare, die sich gegenseitig überwachen. Land H hat Land M schon lange im Auge. Der Kaiser von Land H hofft, dass schwarze Magier eine riesige Barriere zwischen zwei Bergen in Land M errichten können. Die Wachen von Land M können sich durch die Barriere nicht gegenseitig überwachen. Der Kaiser möchte, dass Sie ihm den optimalen Standort für die Platzierung der Barriere mitteilen. Sie sind der vertrauenswürdigste Militärberater des Kaisers. Jetzt braucht er Sie, um dem Kaiser bei der Berechnung des optimalen Standorts für die Barriere und der maximalen Reduzierung der Verteidigungskraft zu helfen.

Eingabe:
Die erste Zeile enthält eine positive ganze Zahl T (T≤20).
Für jeden Datensatz enthält die erste Zeile eine positive ganze Zahl n (2≤n≤50000).
Die nächsten n verschiedenen positiven ganzen Zahlen H1, H2, H3, ..., Hn (0 ≤ Hi ≤ 109) repräsentieren jeweils die Höhe jedes Berges im Querschnitt.
(Die gelesenen Daten sind relativ groß. Es wird empfohlen, zum Lesen scanf anstelle von cin zu verwenden.)
Für 60 % der Daten ist n ≤ 500.
Für 80 % der Daten ist n ≤ 5000.
Für 100 % der Daten ist n ≤ 50000

Ausgabe:
Jeder Datensatz gibt eine Zeile in der Form „Fall #N: XC“ aus, N stellt den aktuellen N-ten Datensatz dar (beginnend bei 1) und zu diesem Zeitpunkt beträgt die Reduzierung C. Wenn es mehrere Lösungen gibt, die den Betrag auf C reduzieren, wird die Lösung ausgegeben, die dem kleinsten X entspricht.

eingeben:

2
3
2 1 3
5
4 5 2 6 3

Ausgabe:

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

Idee: Öffnen Sie zwei Arrays, Präfix bzw. Suffix, und verwenden Sie den Stapel, um jedes Mal die Anzahl der im Array gespeicherten Sentinel-Paare beizubehalten.

Verwenden Sie abschließend: prefix[n]-(prefix[i-1]+suffix[i]), um die Simulationsantworten zu durchlaufen;

Werfen wir einen Blick auf den Code:

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

Nächster Artikel Das Berechnungsproblem von MoonLight

Ich denke du magst

Origin blog.csdn.net/weixin_74088105/article/details/131747734
Empfohlen
Rangfolge