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