导弹拦截系统(贪心基础)

提交链接

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

Sample Input
8 389 207 155 300 299 170 158 65

Sample Output
2

思路:
这题利用贪心思想,换句话说,因为我们想省钱嘛,不想搞那么多系统,所以不到迫不得已的情况下我们是不会买系统的。
比如说:现在假定我们有3套系统,1号系统能拦截高度为200,2号系统能拦截的高度为150米,3号系统能拦截的高度为180米。
现在突然来了一个120米的导弹,我们肯定会选择2号系统来接吧,每次都选择最优的

假定未买的系统能拦截的高度为无限大
系统编号
1 无限大
2 无限大
3 无限大
4 无限大
5 无限大
6 无限大
。。。。
现在我们来模拟一下样例
6 180 260 160 200 190 165

180:此刻没有系统,用1号拦截
**************************编号1 180
260,用2号系统拦截
**************************编号1 180
**************************编号2 260
160,1号或2号都可拦截,为了以后着想,选1号
**************************编号1 160
**************************编号2 260
200,选2号拦截,如果上次不选择最优,那这次仍需要再买一套系统了
**************************编号1 160
**************************编号2 200
190,选2号系统
**************************编号1 160
**************************编号2 190
165,选2号系统
**************************编号1 160
**************************编号2 165

最终只能买两套即可。
可能会有很多的疑问,为什么一定要这样,仔细琢磨琢磨

有没有 感觉这样实现的话需要开很多的数组呢
其实一个数组就能搞定,下面仔细看看代码吧

#include<stdio.h>
int s[10100];//s[i]代表编号为i的系统此刻能拦截的最大高度
int main()   //注意编号靠前的拦截高度永远<=编号靠后的拦截高度
{
	int n;
	while(~scanf("%d",&n))
	{
		int i,x,j,flag;
		int top=0;
		scanf("%d",&x);
		s[++top]=x;首先必须要买一套系统
		for(i=2;i<=n;i++)
		{
			scanf("%d",&x);来发导弹
			flag=0;
			for(j=1;j<=top;j++)数组内高度永远是从小到大排列的
			{、、、、、、、、、、所以从下往上遍历
				if(s[j]>=x)符合要求就跳出
				{
					s[j]=x;
					flag=1;
					break;
				}
			}
			if(!flag)再买一套
				s[++top]=x;
		}
		printf("%d\n",top);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Helinshan/article/details/110679716