[ luogu ] P1020 导弹拦截

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入输出格式

输入格式:

一行,若干个正整数最多100个。

输出格式:

2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入输出样例

输入样例#1:
389 207 155 300 299 170 158 65
输出样例#1:
6
2


详细内容
如下(代码中有解析)
本弱的代码
 1 #include<bits/stdc++.h>
 2 int max(int x,int y)//比较大小函数 
 3 {     
 4      if(x>y)
 5        return x;
 6     else 
 7        return y;
 8 }
 9 
10 using namespace std;
11 int n,a[105],dp[105],maxn=-1;
12 int m[105];
13 int main()
14 {
15         while ((scanf("%d",&a[++n]))!=EOF){}//无限输入 
16          n=n-1;
17         int min,k=1,mini;//k代表导弹拦截系统需要几套 
18         m[1]=a[1];//m数组用于存储当前第k组中的最低导弹高度
19         for(int i=2;i<=n;i++)
20         {min=30000;//题目条件,导弹最高不超过30000 
21           
22           for(int j=1;j<=k;j++)//寻找当前k组中,是否有满足该导弹加入的序列
23              if(m[j]>=a[i]&&m[j]<min)//若第j组的最小值比当前读入高度大 
24              {
25                  min=a[i];//与m[j]<min相应,保证该数只存在一个数组中 
26                  mini=j;
27              }
28              
29              if(min==30000)//即上面没有找到符合的递减序列 
30              {
31                  k+=1;//创造一个新的递减序列 
32                  m[k]=a[i]; 
33              }
34              else//即上面有找到符合的递减序列 
35              m[mini]=a[i];
36         }
37         cout<<k<<endl;
38             return 0;
39 }





原文地址:https://www.cnblogs.com/lyyl/p/7233459.html