2. 拦截导弹

2. 拦截导弹

【问题描述】

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

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

输入格式

一行,为导弹依次飞来的高度

输出格式

两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数

样例输入

389 207 155 300 299 170 158 65

样例输出

6

2

思路

将所有导弹的高度存放到一个数组中遍历数组,一开始将第一个导弹高度当作系统设备能拦截导弹的最大高度,又要满足以后每一发炮弹都不能高于前一发的高度,因此这样的数组的子数组应该是个递减的数组,然后每发一次导弹那么系统设备雷达的高度就改变成当前导弹的高度,当出现后面导弹高度比前一个导弹的高度高时候,那么说明系统设备拦截不到导弹,那么就把已经拦截的导弹的个数存放到记录数组中,同时这时候应该要换一套设备,更换一套设备后,导弹发射仍然从第一颗导弹开始,然后跳过前两个第一套设备已经拦截了的导弹,从拦截失败的导弹开始,所以这时候判断上一套设备拦截失败的导弹和第一颗导弹比较,如果比第一颗导弹大,那么拦截失败,这样再次更换下一套系统设备。直到拦截到为止或者是最后一棵导弹为止就结束更换设备。如果比第一颗导弹小,那么和第一套设备一样,一直发射导弹,直到出现导弹拦截失败或者是导弹已经是最后一发为止就结束,如果导弹是最后一发导弹,而且也被拦截了,那么这时候就把已经拦截的导弹的个数存放到记录数组中,数组的长度就是系统设备数量,数组中每一个存放的内容,就是每一套设备拦截的导弹数目。

import java.util.Scanner;

public class demo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  Scanner in=new Scanner(System.in);
	   	  System.out.println("请输入你要发射的导弹数:");
	   	  int y=in.nextInt();
	   	  int[] arr=new int[y];
	   	  System.out.println("请输入你要发射的导弹高度:");
	   	  //int brrw=new int[y];
	   	  for(int i=0;i<y;i++) {
	   		  arr[i]=in.nextInt();
	   	  }
	   	 int count=1;//拦截的导弹数目
	   	  int[] brr=new int[y];//数组长度即为拦截设备数,内容为每台设备拦截的导弹个数
	   	  int k=0;//brr下标
	   	  int temp=0;//记录arr[i+1]>arr[i]时的i+1位置
	   	  int one=arr[0];
	   	  for(int i=temp+1;i<y;i++) {
	   	   if(one>=arr[i]) {
	   		 if(arr[i]<=arr[i-1]) {
	   			 count++;
	   			 if(i==y-1) {//当最后一个元素也比它前一个元素小时,保存值结束
	   				 brr[k]=count;
	   			 }
	   		 }
	   		 else {
	   			 while(true) {
	   		     brr[k]=count;
	   			 k++;
	   			 temp=i;
	   			 //num++;
	   			 if(one>arr[temp]) break;
	   		 }
	   			 count=2;//第二个设备
	   	  }
	   	  }
	   	   else {
	   		   brr[k]=count;
	   		   k++;
	   		   continue;
	   		  
	   	   }
	   	  }
	   	  int max=brr[0];//最大拦截导弹数目
	   	  for(int m=0;m<=k+1;m++) {//注意这里输出k+1是为了查看k后的一个元素是否是0,则只是方便测试,实际中并不需要
	   		  if(brr[m]>max) {
	   			  max=brr[m];
	   		  }
	   		  
	   	  }
	   	  System.out.println("最大拦截导弹数目为:"+max);
	   	  System.out.println("最少设备数目为:"+(k+1));
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值