导弹拦截(经典)单调队列优化版
Posted brilliant107
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导弹拦截(经典)单调队列优化版相关的知识,希望对你有一定的参考价值。
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是 le 50000≤50000 的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入输出格式
输入格式:
11 行,若干个整数(个数 le 100000≤100000 )
输出格式:
22 行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入输出样例
1 var 2 n,ans,i,l,r,mid:longint; 3 a,f:array[0..100005]of longint; 4 5 begin 6 n:=1; 7 read(a[n]); 8 while not eoln do 9 begin 10 inc(n); 11 read(a[n]); 12 end; 13 ans:=0; 14 f[0]:=maxlongint; 15 for i:=1 to n do 16 begin 17 if f[ans]>=a[i] then 18 begin 19 f[ans+1]:=a[i]; 20 inc(ans); 21 end 22 else 23 begin 24 l:=0;r:=ans; 25 while l<r do 26 begin 27 mid:=(l+r)div 2; 28 if f[mid]<a[i] then r:=mid 29 else l:=mid+1; 30 end; 31 if l<>0 then f[l]:=a[i]; 32 end; 33 end; 34 writeln(ans); 35 ans:=0; 36 fillchar(f,sizeof(f),0); 37 for i:=1 to n do 38 begin 39 if f[ans]<a[i] then// ans记录的是几台系统,如果辆导弹高度相等, 40 begin // 就不需要加一台系统,所以不加等于号 41 f[ans+1]:=a[i]; 42 inc(ans); 43 end 44 else 45 begin 46 l:=0;r:=ans; 47 48 while l<r do 49 begin 50 mid:=(l+r)div 2; 51 if f[mid]>=a[i] then r:=mid 52 else l:=mid+1; 53 end; 54 if l<>0 then f[l]:=a[i]; 55 end; 56 end; 57 writeln(ans); 58 end.
以上是关于导弹拦截(经典)单调队列优化版的主要内容,如果未能解决你的问题,请参考以下文章