[NOIP] interceptores de misiles

[NOIP] interceptores de misiles

título

título Descripción

Un país con el fin de defenderse de los ataques de misiles enemigos, para desarrollar un sistema de interceptación de misiles. Pero este sistema de misiles interceptores tiene un defecto: Aunque se trata de las primeras rondas para llegar a cualquier altura, pero cada concha y no debe ser más alto que antes de que la situación se puso de altura. Un día, el radar recogió misiles enemigos. A medida que el sistema se encuentra todavía en fase beta, por lo que sólo un sistema, y ​​por lo tanto no puede interceptar todos los misiles.

Introduzca la altura a su vez misiles volando (altura de los datos de radar dados es \ le 50000≤50000 un número entero positivo), calcular la cantidad del sistema para interceptar el misil, si se desea interceptar todos los misiles número mínimo de sets para ser equipados con un sistema de interceptación de tales misiles .

Formato de entrada
de una línea, una pluralidad de número entero (número ≤100000)

Formato de salida
de 2 líneas, cada uno un entero, el primer número indica la cantidad del sistema hasta misiles de intercepción, el segundo número indica si se desea interceptar todos los misiles número mínimo de sets para ser equipados con un sistema de intercepción de misiles.

entrada y salida de la muestra

Copiar Entrada # 1
389 207 155,300,299,170,158 65
Salida de copias # 1
. 6
2

Descripción / Consejos

Para darle un mejor algoritmo de prueba n, esta pregunta abierta spj, n lateral 100, nlogn200 puntos

Pregunté cada dos puntos, de acuerdo a la sub preguntó

análisis

Este canal es el asunto "más largas problemas altura tal secuencia a" en dos problemas.

1. Cada atrás el pelo fuera de la carcasa frontal no sea mayor que la altura, se busca la secuencia más larga no se eleva

2. Buscar un mínimo de varios conjuntos de conchas, está buscando una mayor secuencia más larga ** ** (Esto es lo que el teorema, la duración de la secuencia más larga de la sub-subida es
de un mínimo de conjuntos, pueden tomar su propia muestra de la simulación bajo, fácil de entender)

Práctica:
Aquí se utiliza slt en el límite distinto y de límite superior (en esencia, el uso de dos puntos, también puede escribir su propia búsqueda binaria en lugar de)

LOWER_BOUND: identificar una primera secuencia de > = número x
de límite superior: identificar una primera secuencia > número x

Y requiere la secuencia se ordenó serie ascendente. (Este es el uso por defecto, por supuesto, se puede cambiar)
el uso y tipo () es similar en Baidu detalle por derecho propio. . (Así yo los he llegado a la conclusión en el momento, miedo de olvidar.)

código

En primer lugar, el código se escribe a menudo O (n ^ 2) por escrito, después de un escrito o (nlogn).

#include<iostream>
#include<cstdio>
using namespace std;


int a[100005];    
int n;
int dp[100005];
int dp2[100005];
int ans1,ans2;
int main(){
	
	while(scanf("%d",&a[++n] )!= EOF);
	n--;
	
	for(int i=1;i<=n;i++){
		dp[i] = 1;
		for(int j=1;j<i;j++){
			if(a[i] <=a[j]){
				dp[i] = max(dp[i],dp[j]+1);
			}
		}
		ans1 = max(ans1,dp[i]);
	}
	
	for(int i=1;i<=n;i++){
		dp2[i] = 1;
		for(int j=1;j<i;j++){
			if(a[i] > a[j]){
				dp2[i] = max(dp2[i],dp2[j]+1);
			}
		}
		ans2 = max(ans2,dp2[i]);
	}
	cout<<ans1<<endl<<ans2;
	return 0;
}
//本来有注释的,但是好像写完没保存,懒的再写了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int n;
int a[100005];
int b[100005],c[100005];
int main(){
	while(scanf("%d",&a[++n])!=EOF){
	}
	n--;	
	int len1=1,len2=1;
	b[1]=a[1];
	c[1]=a[1];
	for(int i=2;i<=n;i++){
		if(b[len1]>=a[i]) b[++len1]=a[i];
		else{
			int k=upper_bound(b+1,b+1+len1,a[i],greater<int>())-b;
			b[k]=a[i];
		}
		if(c[len2]<a[i]) c[++len2]=a[i];
		else{
			int k=lower_bound(c+1,c+1+len2,a[i])-c;
			c[k]=a[i];
		}
	}
	cout<<len1<<endl<<len2;
	return 0;
} 
Publicado 75 artículos originales · ganado elogios 1 · vistas 3627

Supongo que te gusta

Origin blog.csdn.net/A793488316/article/details/105316472
Recomendado
Clasificación