题目大意:
有 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;
}