chcod炸弹

【题目描述】

话说Cpp国和Pas国发生了战争, Pas国派出了强大的飞机战队, Cpp国于是使出了炸弹CHCOD 来反击Pas国的飞机舰队。然而CHCOD的发射器,只能逐渐往上打。所以Cpp国现在只能打 掉一部分的Pas国飞机。现在给出每舰队一个Pas国飞机飞行高度,求Cpp国最多打掉Pas 国飞机数(如果高度< 0,则是钻地机,CHCOD炸弹打不到) 

【输入格式】

第一行:n Pas国发出的飞机舰队飞机数量 第二行:n个数,Pas国飞机飞行高度。

【输出格式】

一个数:Cpp国最多打掉Pas国飞机数。

【分析】

简单的最长上升子序列,一般的做法O(n^2),这里明显会超时,所以我们就用一个O(n log n)的算法。

我们先设置一个stack栈,存储我们的序列,然后我们维护这个stack,每次用二分找出比top大的最小的数,然后替换就可以了。

【代码】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int n,top;
 6 int a[100010],st[100010];
 7 
 8 int main()
 9 {
10     scanf("%d",&n);
11     int cnt=0;
12     for(int i=1;i<=n;i++){
13         int x;
14         scanf("%d",&x);
15         if(x>=0)a[++cnt]=x;
16     }
17     top=0; n=cnt;
18     for(int i=1;i<=n;i++){
19         if(a[i]>st[top])st[++top]=a[i];
20         else{
21             int l=1,r=top;
22             while(l<r){
23                 int mid=(l+r)>>1;
24                 if(st[mid]>a[i])r=mid;
25                 else l=mid+1;
26             }
27             st[l]=a[i];
28         }
29     }
30     printf("%d
",top);
31     return 0;
32 }
黎明的朝阳,会为苦难中最坚强的信念升起
原文地址:https://www.cnblogs.com/Dawn-Star/p/9129623.html