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 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的...