Misil interceptor ZZUSOFTOJ (función de uso)

1116: misil interceptor

Límite de tiempo: 1 segundo Límite de memoria: 128 MB
Envío: 4 Resolución: 3
[ Envío ] [ Estado ] [ Tablero de discusión ] [Protector: Importación externa]

Descripción del Título

  Cierto país ha desarrollado un sistema de interceptación de misiles para defenderse de los ataques con misiles enemigos. Sin embargo, este sistema de interceptación de misiles tiene un defecto: aunque su primer proyectil puede alcanzar cualquier altura, cada proyectil posterior no puede ser más alto que el anterior. Un día, el radar captó un ataque con misiles enemigos. Dado que el sistema aún se encuentra en la fase de prueba, solo hay un sistema, por lo que es posible que no pueda interceptar todos los misiles. 
    Ingrese la altitud de los misiles por turno (los datos de altitud proporcionados por el radar es un número entero positivo no mayor de 30,000), calcule el número máximo de misiles que este sistema puede interceptar y cuántos conjuntos de tales sistemas de interceptación de misiles se requieren para interceptar todos los misiles. 

 

entrar

Una línea es la altura de los misiles volando a su vez. 

 

Salida

Las dos líneas son el número máximo de misiles que se pueden interceptar y el número mínimo de sistemas que se deben equipar para interceptar todos los misiles. 

 

Entrada de muestra

389207155300299170158 65

 

Salida de muestra

6 
2

 

análisis:

El método de las dos preguntas es el mismo (aunque parece elegante y problemático), es decir, clasifique los datos generales en orden ascendente y descendente y utilice una función para simplificar la operación.

Enfatice la distinción entre las siguientes cuatro funciones:

lower_bound( begin,end,num)//求数组中(begin到end-1)第一个大于等于num的地址

upper_bound( begin,end,num)//大于

lower_bound( begin,end,num,greater<type>() )//小于等于

upper_bound( begin,end,num,greater<type>() )//小于

Código:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int a, ans2 = 1, ans1 = 1, ma[10010] = { 0 }, mi[10010] = { 0 };//ma为降序,mi为升序
	cin >> a;
	mi[0] = a;
	ma[0] = a;
	while (scanf("%d", &a) != EOF)
	{
		if (a<ma[ans1 - 1])
		{
			ma[ans1] = a;
			ans1++;
		}
		else
		{
			*upper_bound(ma, ma + ans1, a, greater<int>()) = a;//找出第一个小于a的位置
		}

		if (a>mi[ans2 - 1])
		{
			mi[ans2] = a;
			ans2++;
		}
		else
		{
			*upper_bound(mi, mi + ans2, a) = a;//找出第一个大于a的位置
		}
	}

	cout << ans1 << endl << ans2;
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_43700916/article/details/88856091
Recomendado
Clasificación