题目
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2
代码
#include<stdio.h>
int main()
{
int N;
int a[10000],b[10000],i,j;
int y,k,e,g;
while(scanf("%d",&N)!=EOF) //题中说有若干组数据
{
for(i=0;i<N;i++)
scanf("%d",&a[i]);
b[0]=a[0];
k=1;//a[k]中始终没有值,a[k-1]有值;
for(i=1;i<N;i++)
{
for(j=0;j<k;j++)//比较
if(a[i]<=b[j])
{
b[j]=a[i];
break;
}
if(j==k)
{
b[k]=a[i];
k++;
}
for(j=0;j<k;j++)//排序
for(y=0;y<j;y++)
{
if(b[j]<b[y])
{
e=b[j];
b[j]=b[y];
b[y]=e;
}
}
}
printf("%d\n",k);
}
}
这道题第一眼看过去我还以为是,一组数据看有几个顺序序列呢,代码都写出来了,一提交发现答案错误,我就知道肯定理解有错误了!题中说最少需要多少个拦截系统,“最少” 就说明一套拦截完了还有另一套还可以继续拦截;
例如:
5个 5 9 5 9 5;
你猜最少需要多少个拦截系统 最少3个
5个 9 5 9 5 5
你猜最少多少个 最少2个;
理解了题意这个题就变得简单了;
就是一个贪心算法;
背包问题:
1.可以开一个数组存放所有导弹,再开一个数组存放拦截系统;
2.比较; 刚来的导弹与第二个背包里的拦截系统去拦截;
3.放入;如果其中可以拦截,就把这个导弹的高度,放入这个拦截系统中,作为之后的最大拦截高度
4.排序,把第二个背包里的拦截系统按照最大高度进行排序;
就是这么简单;(这是一道考验理解能力的题);