首页 > 代码库 > 导弹拦截--优化算法
导弹拦截--优化算法
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,并且输出如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
第一问,很简单,最长不上升子序列+优先队列,O(NlogN)
第二问,可以转化成最长上升子序列(自己想),时间复杂度同上。
1 var 2 s,s2:string; 3 i,j,t,n,tail:longint; 4 a,queue:array[0..10000]of longint; 5 function posdown(value:longint):longint; 6 var 7 middle,left,right:longint; 8 begin 9 left:=1; 10 right:=tail+1; 11 while left<right do 12 begin 13 middle:=(left+right) div 2; 14 if queue[middle]>=value then left:=middle+1 15 else right:=middle; 16 end; 17 posdown:=left; 18 end; 19 function posup(value:longint):longint; 20 var 21 middle,left,right:longint; 22 begin 23 left:=1; 24 right:=tail+1; 25 queue[right]:=maxlongint; 26 while left<right do 27 begin 28 middle:=(left+right) div 2; 29 if queue[middle]<value then left:=middle+1 30 else right:=middle; 31 end; 32 posup:=left; 33 end; 34 begin 35 readln(s); 36 s:=s+‘ ‘; 37 j:=1; 38 for i:=1 to length(s) do 39 begin 40 if s[i]=‘ ‘ then 41 begin 42 inc(n); 43 s2:=copy(s,j,i-j); 44 val(s2,a[n],t); 45 j:=i+1; 46 end; 47 end; 48 tail:=0; 49 for i:=1 to n do 50 begin 51 t:=posdown(a[i]); 52 queue[t]:=a[i]; 53 if t>tail then inc(tail); 54 end; 55 writeln(tail); 56 tail:=0; 57 fillchar(queue,sizeof(t),0); 58 for i:=1 to n do 59 begin 60 t:=posup(a[i]); 61 queue[t]:=a[i]; 62 if t>tail then inc(tail); 63 end; 64 writeln(tail); 65 end.
导弹拦截--优化算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。