c 问题 拦截导弹

来源:百度知道 编辑:UC知道 时间:2024/05/22 15:45:06
拦截导弹
背景 Background
实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练。

描述 Description
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入格式 Input Format
输入数据为两行,
第一行为导弹的数目N
第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数。
(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。

输出格式 Output Format
输出只有一行是这套系统最多能拦截的导弹数和要拦截所有导弹最少要配备这种导弹拦截系统的套数。两个数据之间用一个空格隔开.

样例输入
8
389 207 155 300 299 170 158 65

样例输出

6 2

我这里只做了第一问
,第2有点水

#include<stdio.h>
main()
{
int d1[20],d2[20];
long j,i,t=0,n;

scanf("%d",&n);

for(i=0;i<n;i++)
scanf("%d",&d2[i]);

for(i=0;i<=n;i++)
d2[i]=1;

for(i=1;i<n;i++)
for(j=1;j<=i;j++)
\

....
小错误就忽略不计了。

最主要的问题是,对于每个导弹的高度不能用逐个比较,
否则你的程序没法正确处理300,150,250,100,125这种输入
300,150可以用系统一拦截,250,100可以用系统二拦截,对于125,虽然不能用系统二拦截了,但可以用系统一拦截
按你的算法就会增加一套系统。

我想的算法是(如果你不会用链表的话)
设置一个数组来储存每套系统当前可以拦截的导弹高度,每遇到一个新的导弹时,先把它的高度跟每个系统的高度比较,如果每个系统都不够高,就创建一个新的系统。
如果有可用的系统,找出可用系统中的最小值,用它来拦截这枚导弹,然后把这套系统的可拦截高度设置成导弹的高度。
最后继续读取下一个数字。

最主要的问题是,对于每个导弹的高度不能用逐个比较,
否则你的程序没法正确处理300,150,250,100,125这种输入
300,150可以用系统一拦截,250,100可以用系统二拦截,对于125,虽然不能用系统二拦截了,但可以用系统一拦截
按你的算法就会增加一套系统。
我想的算法是(如果你不会用链表的话)
设置一个数组来储存每套系统当前可以拦截的导弹高度,每遇到一个新的导弹时,先把它的高度跟每个系统的高度比较,如果每个系统都不够高,就创建一个新的系统。
如果有可用的系统,找出可用系统中的最小值,用它来拦截这枚导弹,然后把这套系统的可拦截高度设置成导弹的高度。
最后继续读取下一个数字。