题目:[NOIP1999]拦截导弹 rqnoj217
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入格式
输入数据为两行,
第一行为导弹的数目N(n<=1000)
第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数。
输出格式
输出只有一行是这套系统最多能拦截的导弹数和要拦截所有导弹最少要配备这种导弹拦截系统的套数。两个数据之间用一个空格隔开.
样例输入
8 389 207 155 300 299 170 158 65
样例输出
6 2
第一问很简单,直接求出最长不上升子序列
第二问我不多说,在RQ上市这样说的
Pascal Code
program rqnoj217;
var
n:longint;
a,f:array[0..1000+10] of longint;
procedure init;
begin
assign(input,'rqnoj217.in');
assign(output,'rqnoj217.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure readdata;
var
i:longint;
begin
read(n);
for i:=1 to n do read(a[i]);
end;
procedure main;
var
i,j,max,min:longint;
begin
max:=1; min:=1;
for i:=1 to n do f[i]:=1;
for i:=1 to n do
begin
for j:=1 to i-1 do
begin
if a[i]>a[j] then continue;
if f[i]<f[j]+1 then f[i]:=f[j]+1;
if f[i]>max then max:=f[i];
end;
end;
for i:=1 to n do f[i]:=1;
for i:=1 to n do
for j:=1 to i-1 do
begin
if a[i]<=a[j] then continue;
if f[i]<f[j]+1 then f[i]:=f[j]+1;
if f[i]>min then min:=f[i];
end;
writeln(max,' ',min);
end;
begin
init;
readdata;
main;
outit;
end.