导弹打飞机问题(贪心算法)

本文介绍了一种基于飞机高度的导弹防御系统算法,通过计算拦截所有飞机所需的最小导弹系统数量,探讨了递减高度限制下的最优防御策略。文章提供了一个实际的C语言实现案例,展示了如何通过贪心算法优化系统配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导弹打飞机问题

问题描述

某国为了防御敌国的飞机的空中袭击,在较短的时间内研发出一套防空导弹系统,这套导弹系统的工作原理是,它有一套配套的雷达系统,该雷达系统可以检测飞来的飞机的高度,但是由于研制的时间短,这套导弹系统存在一定的BUG,就是当一个导弹打击的飞机高度,是递减的,比如说第一个打击的飞机高度是一万米,那么它打击的第二架飞机的高度,是递减的,比如说9千米,第三架的高度更低,比如说八千,打击飞机的高度一样没关系,但是不能升高了,打击飞机的高度,只能越打越低,然后假设飞机飞来的高度,我们已经知道了,假设飞机已经飞来,都飞在固定高度,高度一动不动的向前飞来。

输入飞机依次飞来的高度。计算要拦截所有飞机最小需要配备多少套这种防空导弹系统。

输入

n架飞机飞来的高度。

输出

要拦截所有飞机所需最小配备的系统数k。

输入样例

6 4 2 8 5 7 9 1 3

输出样例

4

提示

输入:请输入飞机的个数:n
请输入每个飞机的高度

输出:最少需要启动的系统数为k

完整代码:

#include "stdafx.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
   int i,j,n,k,x;
	int a[1000];//存储每个飞机的高度
	int	b[1000];//存储每个系统当前能打到的最低高度,数组下标代表系统编号
	printf("请输入飞机的个数:\n");
	scanf("%d",&n);
    printf("请输入每个飞机的高度:\n");
	for(i=1;i<=n;i++){
	   scanf("%d",&a[i]);
	}
	k=1;//初始化第一个系统
b[1]=a[1];//将第一个飞机的高度作为第一个系统能打到的最低高度放入数组
	for(i=2;i<=n;i++){//将后续的飞机高度依次取出
		x=0;
		for(j=1;j<=k;j++){//将飞机高度与每个系统的最低高度比较
			if(a[i]<=b[j]){//找到最低高度比飞机高度大的系统
				if(x==0){
					x=j;//标记第一个最低高度比该飞机高度大的系统的编号
				}
				else if(b[x]>b[j]){//贪心选择,将之后找到的系统与标记的系统比较,如果比之前的小则替换之前的
					x=j;//记录最合适的系统的编号
				}
			}
		}
        if(x==0){//没找到
				 k++;//新建一个系统
              b[k]=a[i]; //将该高度作为新系统的最低高度存入数组
		  }
		  else{//更新最合适的系统的最低高度
				 b[x]=a[i];
		  }
	}
   printf("最少需要启动的系统数为:\n ");
	printf("%d\n",k);
	return 0;
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LongTermism

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值