题目
分析
对于第一问,题目说拦截的每一个导弹高度都必须比上一个低,然后求拦截的最多的导弹,这显然是求最长不上升子序列。而对于第二问,是求一个最长上升子序列。最后输出两个序列的长度即可。
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100005], d1[100005], d2[100005];
int main()
{
int n = 0;
while (~scanf("%d", &a[++n]));
n--;
int len1 = 1, len2 = 1;
d1[1] = a[1], d2[1] = a[1];
for (int i = 2; i <= n; i++)
{
if (d1[len1] >= a[i])
{
d1[++len1] = a[i];
}
else
{
int p1 = upper_bound(d1 + 1, d1 + 1 + len1, a[i], greater<int>()) - d1;
d1[p1] = a[i];
}
if (d2[len2] < a[i])
{
d2[++len2] = a[i];
}
else
{
int p2 = lower_bound(d2 + 1, d2 + 1 + len2, a[i]) - d2;
d2[p2] = a[i];
}
}
printf("%d\n%d\n", len1, len2);
return 0;
}