攔截飛彈 題解

2021-08-11 10:45:05 字數 3623 閱讀 9424

description

ggf最近經常遭到不明飛彈的襲擊,因此他只好開發了一套飛彈攔截系統。

該系統非常先進,使用會拐彎的雷射對飛彈進行射擊。-_-

所有被雷射擊中的飛彈就瞬間完蛋,而且一束雷射可以同時摧毀多枚飛彈。

但雷射只能向上發射,所以若同一束雷射能依次擊中多枚飛彈,則這些飛彈座標的每一維都嚴格單調上公升。建立了乙個三維座標系後:

假設4枚飛彈座標為:(0, 0, 0) (1, 1, 0) (1, 1, 1), (2, 2, 2)

則一束雷射可以依次擊毀1,3,4號飛彈,卻不能依次擊毀1,2,4,也不能依次擊毀4,3,1。

現在,ggf發現n枚飛彈正向自己飛來。-_-

在定位了飛彈的座標後,他想知道,只發射一束雷射最多可以摧毀多少枚飛彈,若要摧毀所有飛彈,至少需要發射多少束雷射。(雷射速度極快,所以可以認為飛彈在那一瞬間靜止,而且雷射間不相互影響)

input

輸入檔案第一行乙個正整數n(1<=n<=2000)。

下面n行,每行3個整數xi,yi,zi(0<=xi,yi,zi<=10^6) ,描述乙個飛彈的座標。

output

兩行,第一行乙個整數表示最多可以攔截多少枚飛彈。

第二行乙個整數表示最少發射多少束雷射才能攔截全部飛彈。

sample input

4 1 2 3

1 1 1

2 5 4

0 1 1

sample output3 2

data constraint

hint

【資料規模】

對於20%的資料,有n<=10。

對於50%的資料,有n<=300。

對於100%的資料如題。

發現飛彈的打擊關係可以變成乙個無環dag

那麼最多打多少飛彈就是求dag中的最長路徑。

多少套系統就是求最小路徑覆蓋。

最小路徑覆蓋=n-最大匹配。

所以跑一遍bfs和匈牙利即可。

type aa=record

x,y,z:longint;

end;

var n,i,j,k,l,tot,tot1,ans:longint;

d,head,head1,f,bz,g,r:array[0..100000]of longint;

next,next1,t,t1:array[0..4000000]of longint;

a:array[0..100000]of aa;

procedure

sort

(l,r:longint);

var i,j,kx,ky,kz:longint;

begin

i:=l;

j:=r;

kx:=a[(l+r)div

2].x;

ky:=a[(l+r)div

2].y;

kz:=a[(l+r)div

2].z;

repeat

while (a[i].xor((a[i].x=kx)and(a[i].yor((a[i].x=kx)and(a[i].y=ky)and(a[i].zdo inc(i);

while (a[j].x>kx)or((a[j].x=kx)and(a[j].y>ky))or((a[j].x=kx)and(a[j].y=ky)and(a[j].z>kz)) do dec(j);

if i<=j then

begin

a[0]:=a[i];

a[i]:=a[j];

a[j]:=a[0];

inc(i);

dec(j);

end;

until i>j;

if ithen sort(i,r);

if j>l then sort(l,j);

end;

procedure

ad(x,y:longint);

begin

inc(tot);

next[tot]:=head[x];

head[x]:=tot;

t[tot]:=y;

end;

procedure

ad1(x,y:longint);

begin

inc(tot1);

next1[tot1]:=head1[x];

head1[x]:=tot1;

t1[tot1]:=y;

end;

procedure

bfs;

var i,j,k,l:longint;

begin

k:=0;

for i:=1

to n do

if r[i]=0

then

begin

inc(k);

d[k]:=i;

f[i]:=1;

end;

i:=0;

while ido

begin

inc(i);

j:=head[d[i]];

while j<>0

dobegin

f[t[j]]:=f[d[i]]+1;

dec(r[t[j]]);

if r[t[j]]=0

then

begin

inc(k);

d[k]:=t[j];

end;

j:=next[j];

end;

end;

ans:=f[d[n]];

end;

function

dfs(x:longint):longint;

var j:longint;

begin

if bz[x]=i then

exit(0);

bz[x]:=i;

j:=head1[x];

while j<>0

dobegin

if (g[t1[j]]=0)or(dfs(g[t1[j]])=1) then

begin

g[t1[j]]:=x;

exit(1);

end;

j:=next1[j];

end;

exit(0);

end;

begin

readln(n);

for i:=1

to n do readln(a[i].x,a[i].y,a[i].z);

sort(1,n);

for i:=2

to n do

begin

for j:=1

to i-1

dobegin

if (a[i].x>a[j].x)and(a[i].y>a[j].y)and(a[i].z>a[j].z) then

begin

ad(j,i);

inc(r[i]);

ad1(j,i+n);

end;

end;

end;

bfs;

writeln(ans);

ans:=0;

for i:=1

to n do ans:=ans+dfs(i);

writeln(n-ans);

end.

攔截飛彈 內無題解

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

攔截飛彈 vip

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

1044 攔截飛彈

1999年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 題目描述 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的...