分析:
依次保存现在每个拦截系统能拦截的最高的高度,接下来输入的每一个高度,依次和这若干个拦截系统现在所能拦截的最高高度比较,若某次该输入的高度小于某个拦截系统的最高高度,就替代这个拦截系统的最高高度;若比这些拦截系统的高度都高,就重新创造一个拦截系统并将这次输入的高度作为新建拦截系统的最高高度.
代码如下:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <fstream>
5 #include <ctime>
6 #include <cmath>
7 #include <cstdlib>
8 #include <algorithm>
9 #include <set>
10 #include <map>
11 #include <list>
12 #include <stack>
13 #include <queue>
14 #include <iterator>
15 #include <vector>
16
17 using namespace std;
18
19 #define LL long long
20 #define INF 0x3f3f3f3f
21 #define MOD 1000000007
22 #define MAXN 10000010
23 #define MAXM 1000010
24 #define inf 0x7fffffffffffffff
25 #define maxf 0x7fffffff
26
27
28 int a[MAXN], b[MAXN]; //数组a保存导弹高度,数组b保存每套系统的最高拦截高度
29
30 int main()
31 {
32 int n;
33 while(scanf("%d", &n)==1)
34 {
35 int cnt = 0; //拦截系统的数量
36 b[0] = 0;
37 for(int i = 0; i < n; i++ )
38 {
39 scanf("%d", &a[i]);
40 for(int j = 0; j <= cnt; j++ ) //每次输入的高度要与现在所有的拦截系统比较
41 {
42 if(a[i]<b[j])
43 {
44 b[j] = a[i];
45 break;
46 }
47 else if(j == cnt)
48 {
49 cnt++;
50 b[cnt] = a[i];
51 break;
52 }
53 }
54 }
55 printf("%d
", cnt);
56 }
57
58 return 0;
59 }