问题描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式
一行,为导弹依次飞来的高度
输出格式
两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.util.Scanner; 5 6 public class Main { 7 public static void main(String arg[]) throws IOException { 8 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 9 String s=br.readLine(); 10 String sz[]=s.split("\\s+"); 11 int high[]=new int[sz.length]; 12 for (int i = 0; i < sz.length; i++) { 13 high[i]=Integer.parseInt(sz[i]); 14 } 15 int d1[]=new int[high.length]; 16 17 /** 18 * 最大拦截导弹数 19 */ 20 for (int i = 0; i < d1.length; i++) { 21 d1[i]=1; 22 } 23 for (int i = 0; i < high.length; i++) { 24 for (int i1 = 0; i1 < i; i1++) { 25 if(high[i]<=high[i1]){ 26 d1[i]=Math.max(d1[i],d1[i1]+1); 27 } 28 } 29 } 30 int max=-1; 31 for (int i = 0; i < d1.length; i++) { 32 if(max<d1[i]){ 33 max=d1[i]; 34 } 35 } 36 37 /** 38 * 最少系统数 39 */ 40 int min=0; 41 boolean lj[]=new boolean[high.length]; 42 for (int i = 0; i < high.length; i++) { 43 int sy=-1; 44 for (int i1 = 0; i1 < i; i1++) { 45 if(lj[i1]==false&&high[i1]>=high[i]){ 46 if(sy==-1||high[i1]<high[sy]){ 47 sy=i1; 48 } 49 } 50 } 51 if(sy==-1){ 52 min++; 53 } 54 else{ 55 lj[sy]=true; 56 } 57 58 } 59 System.out.println(max); 60 System.out.println(min); 61 62 63 } 64 65 66 67 68 69 /* 70 这代码样例可过,但在io中有问题,应该是在求io上出现问题 71 public static void main(String arg[]){ 72 Scanner in=new Scanner(System.in); 73 String s=in.nextLine(); 74 String sz[]=s.split("\\s+"); 75 int sz1[]=new int[sz.length]; 76 for (int i = 0; i < sz.length; i++) { 77 sz1[i]=Integer.parseInt(sz[i]); 78 } 79 int d1[]=new int[sz1.length];//求最大下降序列长度 80 int d2[]=new int[sz1.length];//求最大上升序列长度 81 for (int i = 0; i < sz1.length; i++) { 82 d1[i]=1;d2[2]=1; 83 } 84 85 for (int i = 0; i < sz1.length; i++) { 86 for (int i1 = 0; i1 < i; i1++) { 87 if(sz1[i]<=sz1[i1]){ 88 d1[i]=Math.max(d1[i],d1[i1]+1); 89 } 90 else{ 91 d2[i]=Math.max(d2[i],d2[i1]+1); 92 } 93 94 } 95 } 96 97 int s1=-1;int s2=-1; 98 for (int i = 0; i < d1.length; i++) { 99 s1=Math.max(s1,d1[i]); 100 } 101 for (int i = 0; i < d2.length; i++) { 102 s2=Math.max(s2,d2[i]); 103 } 104 System.out.println(s1); 105 System.out.println(s2); 106 107 } 108 */ 109 110 }