
C语言 拦截导弹
完全了解你的情况,都是被计概习题逼的啊。
这里有一个同学编的程序,虽然很小,但非常巧妙,绝对可以pass,试试看吧。
但提醒一下:pass以后,请仔细读一读这个程序,知道它为什么可以通过好吗
#include
用C语言实现拦截导弹问题或给出算法
给,已经在VC上编译运行确认:#include for (i=n-1;i>=1;i--) { for (j=n;j>=i+1;j--) { if (a[i]>a[j] && l[j]+1>l[i]) { l[i]=l[j]+1; }\\\/\\\/printf(%d %d\\\ ,i,j);} max=0,ss=1;\\\/\\\/for(i=1;i<=n;i++) printf(%d ,l[i]);printf(\\\ ); for (i=1;i 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入格式 Input Format 输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。 输出格式 Output Format 输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。 第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。 样例输入 Sample Input 389,207,155,300,299,170,158,65 样例输出 Sample Output 6,1 其它测试输入样例389,207,155,300,299,170,65,1585,3,1,4,3,2,1,01,2,3,4,5,6,2*\\\/\\\/*分析,问题是动态规划与Dilworth定理题目*\\\/int main() { char s[105]; int i, j, n, a[21], l[21], sign[21], max = 0, min = 0; scanf(%s, s); \\\/\\\/min 代表最长递增序列长度 max 代表最短递减序列长度 for (i = 0, j = 0, a[0] = l[0] = sign[0] = 0; i < strlen(s); i++) { if (s[i] == ',') { a[++j] = 0; sign[j] = 1; l[j] = 1; } else { a[j] = a[j] * 10 + (s[i] - '0'); } } n = j; for (i = n - 1; i >= 0; i--) { int maxflag = 0, minflag = 0; j = i + 1; while(j <= n) { if(a[i] > a[j]) { if(l[i] < l[j]) { l[i] = l[j]; } maxflag = 1; } else if(a[i] < a[j]) { if(sign[i] < sign[j]) { sign[i] = sign[j]; } minflag = 1; } j++; } if(maxflag) l[i]++; if(minflag) sign[i]++; if(max < l[i]) { max = l[i]; } if(min < sign[i]) { min = sign[i]; } } printf(%d,%d\\\ , max, min - 1); return (0); } 这个问题其实就一个序列最长的非递增序列。 定义一个状态以a[i]为最后一个拦截的导弹序列的最长长度。 例如a[0]=300;a[1]=207;a[2]=155;a[3]=300;...我们从头向后看。 以a[0]为最后一个导弹序列的最长长度,和明显就是a[0]自己。 也就是1.以a[1]为最后一个导弹序列的最长长度,因为递减所以就是a[0],a[1],长度为2.以a[2]为最后一个导弹序列的最长长度,应该前面所有大于a[2]的序列加上1,然后从中取最大的,也就是a[0],a[1],a[2]下面是程序代码#include 我给你写了一个,不过得出的序列可能并不是唯一的,但保证是正确的 时间复杂度是O(n^2),你所说的n*logn的目前我是做不出来,等做出来再告诉你吧 #include int dmax=0,xh=0; \\\/\\\/记录拦截的最大个数以及第一个被拦截的序号cin>>n; \\\/\\\/输入拦截的导弹数for(i=0;i 难以拦截的弹道导弹主要是针对中远程和等战略弹道导弹而言,主要有以下原因:1、战略弹道导弹是所有国家的,发射装置很隐蔽,并且可以机动发射,因此很难预警,若想在其发射段将其摧毁更是难上加难,需要大量的情报工作作为基础。 2、现有防空导弹射高最多2~30公里,战略弹道导弹巡航阶段的弹道很高,没有几种拦截武器能够达到该射程,即便能够达到,则武器成本也会极高,体积也会很大,除非在太空上布置拦截。 3、弹道导弹进入大气层后,速度可以达到5~9马赫,而且还可以使用机动规避,或者分导多弹头,有的导弹(如白杨M机动型)还可变为,改用低弹道飞行,极其难以发现,因此命中难度极高。 4、弹道导弹的末段动能巨大,即便被命中也几乎不能使其偏离航向。 5、弹道导弹的弹头一般都可以在目标上空爆炸,这比在落地爆炸的杀伤效果更好,即在低空拦截后仍然无法消除其杀伤力。导弹拦截 C语言
简单C程序题目 拦截导弹问题
导弹拦截问题 C程序 动态规划
动态规划导弹拦截问题,输入怎么弄,要c++或者c的



