HDU 1257 最少拦截系统 (贪心)

题目大意:

有 n 发炮弹打过来,现在需要拦截系统拦截,不过每套拦截系统的第一发炮弹可以打任意高度,之后没发炮弹都不高于前一发,问最少需要几套拦截系统。


思路:

为拦截第一发炮弹最少需要一套拦截系统,对于之后来的炮弹,很明显应该采取贪心的策略从现有的拦截系统中挑可以拦截的最低的系统去拦截,比如高度为 3 的炮弹打来,有 2,4,5 的拦截系统,自然是用 4 的去拦截。如果现有的都比炮弹低,则增加一套系统。


具体实现:

我们用数组来保存拦截系统可以拦截的高度。开始时,只有一套可以拦截第一发炮弹的拦截系统,如果来一个比它低的,直接拦截并更新高度,如果不能拦截,则在数组尾增加一个该炮弹高度的拦截系统。对于以后的炮弹要在现有的拦截系统中挑可以拦截的最低的系统,这样一来更新后还是保证了数组是升序的。所以只要每次从数组第 0 个元素找满足条件的第一个拦截系统就可以了。


代码:

#include<iostream>
using namespace std;

int main()
{
	int i,j,n,x,f,ans,a[100010];
	while(~scanf("%d",&n))
	{
		scanf("%d",&x);
		a[0]=x; //开始时只有一个 
		ans=1; 
		for(i=1;i<n;i++)
		{ //每次从数组头开始找第一个满足条件的 
			scanf("%d",&x);
			f=0;
			for(j=0;j<ans;j++)
				if(a[j]>=x)
				{ //如果有则更新高度并退出 
					f=1;
					a[j]=x;
					break;
				}
			if(f==0) a[ans++]=x; //如果没有就增加到数组尾 
		} //a 数组会一直保证升序 
		printf("%d\n",ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值