|
|
|
@ -11,7 +11,6 @@ int main() {
|
|
|
|
|
// 用整行字符串+流的办法,读入多个带空格的数字
|
|
|
|
|
int n;
|
|
|
|
|
while (cin >> a[n]) n++;
|
|
|
|
|
|
|
|
|
|
// 第一问
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
f[i] = 1;
|
|
|
|
@ -24,12 +23,14 @@ int main() {
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
// 用贪心的思想来模拟创建新的导弹系统,或者,加入一个比h[i]大的导弹系统,并且,尾巴值最小的那套导弹系统中去
|
|
|
|
|
// q[cnt] : 现在共cnt套导弹系统,q[i]记录的是每套导弹系统中最后一个拦截的高度
|
|
|
|
|
int k = 0;
|
|
|
|
|
while (k < ql && q[k] < a[i]) k++;
|
|
|
|
|
if (k == ql) // 如果没有找到可以接在后面的导弹拦截系统,那么需要创建一套新的拦截系统
|
|
|
|
|
// int k = 0;
|
|
|
|
|
// while (k < ql && q[k] < a[i]) k++;
|
|
|
|
|
int p = lower_bound(q, q + ql, a[i]) - q;
|
|
|
|
|
|
|
|
|
|
if (p == ql) // 如果没有找到可以接在后面的导弹拦截系统,那么需要创建一套新的拦截系统
|
|
|
|
|
q[ql++] = a[i];
|
|
|
|
|
else
|
|
|
|
|
q[k] = a[i]; // 否则就直接接到找到的第k套拦截系统的后面,那么,第k套拦截系统的最后一个拦截高度=q[k]=h[i]
|
|
|
|
|
q[p] = a[i]; // 否则就直接接到找到的第k套拦截系统的后面,那么,第k套拦截系统的最后一个拦截高度=q[k]=h[i]
|
|
|
|
|
}
|
|
|
|
|
// 输出最长不升序列长度,即:最多能拦截的导弹数
|
|
|
|
|
printf("%d\n%d\n", res, ql);
|
|
|
|
|