题目链接:https://vjudge.net/contest/347031#problem/I
分析:
给定的顺序是导弹依次飞来的顺序。所以不能排序。
刚开始想着从第一个数开始,若后面的数小于前面的数说明系统依次都能打到。若某一个高度大于前面的高度,系统的数量就++。
举个例子:
5发炮弹依次打来。
对于1和2可以用一个拦截系统。
拦截系统1的最高拦截高度为炮弹2的高度。
对于炮弹3,需要重新开一个拦截系统2。
拦截系统2的最高拦截高度为炮弹4的高度。
对于炮弹5,若按照上述思想需要重新开一个拦截系统。
但是可以看出拦截系统1的高度就可以把炮弹5拦截了,不需要重新开新的拦截系统。
用拦截系统1拦截后,拦截系统1的最大高度缩小为炮弹5的高度。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
int n,high[N];
int sum[N];
int main()
{
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
scanf("%d",&high[i]);
int num=1;
sum[1]=high[1];
for(int i=1; i<=n; i++)
{
int f=0;
for(int j=1; j<=num; j++)
{
if(high[i]<=sum[j])
{
f=1;
sum[j]=high[i];
break;
}
}
if(!f)
{
num++;
sum[num]=high[i];
}
}
printf("%d\n",num);
}
return 0;
}
最艰辛的日子,总是耐人寻味。