回 帖 发 新 帖 刷新版面

主题:高手请教!!我是菜鸟!!!

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

Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数) 

Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。 

Sample Input
300 250 275 252 200 138 245

Sample Output
5 2

用pascal 怎样解?
最好有原程序

回复列表 (共1个回复)

沙发

求这套系统最多能拦截多少枚导弹,实际是求最长不降子序列。因为数据规模只有20,所以用经典求法: 
a[i]:=max{1,a[j]+1} if d[j]<=d[i],1<=j<=i-1
q:=max{a[i]} 1<=i<=n

    求最少需要多少套系统,用贪心法:
    对于一颗导弹,每次总是用代价最小的系统去拦截,系统的代价=系统当前高度-导弹高度,新系统的代价为maxint,高度不够的系统的代价为maxint+1。
==========================源程序====================================
 czyhd  原创  2005-11-01 21:02:10  查看评论    
 
   

简单的动态规划+贪心

program tju1004;
var n,s,l:array[0..20] of integer;
   a,i,k,answer,p,j:integer;
begin
fillchar(l,sizeof(l),0);
a:=0;
while not eof do begin
    a:=a+1;
    read(n[a]);
    end;
s[0]:=0;
answer:=0;
for i:=1 to a-1 do begin
    s[i]:=0;
    for k:=0 to i-1 do
        if ((k=0) or (n[k]>=n[i])) and (s[k]+1>s[i])   then
        s[i]:=s[k]+1;
    if s[i]>answer then answer:=s[i];
    end;
write(answer);
write('':1);
k:=1;
l[1]:=n[1];
for i:=1 to a-1 do begin
    p:=0;
    for j:=1 to k do
        if (l[j]>=n[i]) and ((p=0) or (l[j]<l[p])) then p:=j;
    if p=0 then begin
        k:=k+1;
        l[k]:=n[i];
        end
    else l[p]:=n[i];
end;
if a=0 then writeln('0')
else
writeln(k);
end.

 

我来回复

您尚未登录,请登录后再回复。点此登录或注册