题目:
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
Output对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65Sample Output
2
分析:
很容易联系到上升子序列,最开始是想计算上升子序列的个数(最小的),但是这个最刚开始考虑的太简单,如果前面同时又几个符合的,应该选出最合适的,也就是符合条件的最小的,将每个序列的最后一个标记为1,最后就可以计算了;
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define inf 0x3f3f3f3f
int a[30005];
int book[30005];
int main()
{
int n,c,minn,t,casee,i,j;
while(scanf("%d",&n)!=EOF)
{
casee=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
memset(book,0,sizeof(book));
book[0]=1;//初始化
for(i=1;i<n;i++)
{
t=-1;
minn=inf;
for( j=0;j<i;j++)
{
c=a[j]-a[i];
if(c>=0&&minn>c&&book[j]==1//标明是一个序列的最后一个,符合条件)
{
minn=c;
t=j;//记录下位置
}
}
if(t!=-1)//说明又符合这个点的序列,将这个点加入
{
book[t]=0;
book[i]=1;
}
else//这里一定注意,第一次就是这里错了,如果没合适的,就自己新开一个序列
book[i]=1;
}
for( i=0;i<n;i++)
{
if(book[i]==1)
casee++;
}
printf("%d\n",casee);
}
return 0;
}