洛谷 P1020 飛彈攔截

2021-07-30 10:15:09 字數 1192 閱讀 9271

題目大意:

對於乙個飛彈攔截系統:它的第一發炮彈能夠攔截任意高度的飛彈,但之後攔截的每一發炮彈都不能高於前一發的高度。輸入n發飛彈依次飛來的高度a[i],計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

1<=n<=100 0< a[i]<=30000

題解:

p[i]表示攔截了第i個飛彈,前i個飛彈用乙個系統最多可以攔截多少個飛彈。

q[i]表示前i個飛彈攔截了第i個飛彈最少要配備多少套飛彈攔截系統。

前提a[j] > a[i]:

p[i]:=max (p[j]+1) (1<=j<=i-1,1<=i<=n)

前提a[j] < a[i]:

q[i]:=max (q[j]+1) (1<=j<=i-1,1<=i<=n)

乙個系統最多能攔截的飛彈為max

攔截全部飛彈的最少系統數為max(q[i](1<=i<=n)

時間複雜度:o(2*n^2)

var

a,p,q:array [0..101] of longint;

i,j,n,max,min:longint;

begin

while

not eoln do

begin

inc(n);

read(a[n]);

end;

for i:=1 to n do

begin

p[i]:=1; q[i]:=1;

end;

max:=0; min:=0;

for i:=1 to n-1

do begin

for j:=i+1 to n do

begin

if (a[j]and (p[i]+1>p[j]) then p[j]:=p[i]+1;

if (a[j]>a[i]) and (q[i]+1>q[j]) then q[j]:=q[i]+1;

end;

end;

for i:=1 to n do

begin

if p[i]>max then max:=p[i];

ifq[i]>min then min:=q[i];

end;

writeln(max);

writeln(min);

end.

洛谷P1020 飛彈攔截

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...

洛谷 P1020 飛彈攔截

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...

洛谷 P1020 飛彈攔截

思路 首先第一問 最多能攔下多少飛彈的答案是給出數列的最長不遞增子串行的長度。這個不難想到 而第二問 至少幾套飛彈系統的答案是給出數列的最長遞增子串行的長度。c include include include include using namespace std const int maxn 1e...