r的半徑共包含三種情況:首先,半徑不能碰邊,因此在它到四個邊界裡找乙個最小值。
然後,我們遍歷已經有半徑的點,然後看看能不能被更新,如上圖,左邊的情況是,左邊的圖對於紅色的圓來說,黑圓圓心距紅圓圓心的距離d減去紅圓的半徑r1如果小於黑圓到四個邊界的距離並且大於0(小於0就出現了第二種情況)那麼黑圓的半徑就必須要更改否則如果如右圖所示,兩個圓心間的距離d減去紅圓的半徑r1小於0則說明黑圓在紅圓的裡面,那麼它就不能擴充套件,所以黑圓的半徑就變成了0。
因為要保證油滴占領的面積最大,所以不停更新,最後用總面積減去圓的面積就是我們的答案。
在更新半徑時必須保證這個點必須有半徑,這樣的話才能更新。
program box;
const
pi=3.1415926;
var n,s,sx,sy,ex,ey:longint;
ans:real;
x,y:array [1..6] of real;
b:array [1..6] of boolean;
d:array [1..6,1..6] of real;
r:array [1..6] of real;
procedure init;
var i:longint;
begin
ans:=0;
fillchar(b,sizeof(b),true);
readln(n);
readln(sx,sy,ex,ey);
s:=abs((sx-ex)*(sy-ey));
if n=0 then
begin
writeln(s);
close(output);
halt;
end;
for i:=1 to n do readln(x[i],y[i]);
end;
function min(x,y:real):real;
begin
if x>y then exit(y) else exit(x);
end;
function check(xx,yy:real):real;
var i:longint;
tr,tm:real;
begin
tr:=maxlongint;
tr:=min(min(abs(xx-sx),abs(xx-ex)),min(abs(yy-sy),abs(yy-ey)));
for i:=1 to n do
begin
if not b[i] then
begin
tm:=sqrt(sqr(xx-x[i])+sqr(yy-y[i]));
if (tm-r[i]0) then
begin
tr:=tm-r[i];
endelse if tm-r[i]<=0 then tr:=0;
end;
end;
exit(tr);
end;
procedure dfs(t:longint);
var i:longint;
temp:real;
begin
if t=n+1 then
begin
temp:=0;
for i:=1 to n do temp:=temp+pi*sqr(r[i]);
if temp>ans then ans:=temp;
exit;
end;
for i:=1 to n do
begin
if b[i] then
begin
r[i]:=check(x[i],y[i]);
b[i]:=false;
dfs(t+1);
b[i]:=true;
r[i]:=0;
end;
end;
end;
begin
init;
dfs(1);
writeln(round(s-ans));
end.
搜尋 油滴擴充套件
1 油滴擴充套件 box 問題描述 在乙個長方形框子裡,最多有n o n 6 個相異的點。在其中任何 個點上放乙個很小的油滴,那麼這個油滴會一直擴充套件,直到接觸到其他油滴或者框子的邊界。必須等乙個油滴擴充套件完畢才能放置下乙個油滴。那麼應該按照怎樣的順序在這n個點上放置油滴,才能使放置完畢後所有油...
luogu cogs 油滴擴充套件
輸入檔案 oilbox.in輸出檔案 oilbox.out簡單對比 時間限制 1 s 記憶體限制 128 mb 在乙個長方形框子裡,最多有n o n 6 個相異的點。在其中任何乙個點上放乙個很小的油滴 即半徑可視為0 那麼這個油滴會一直擴充套件,直到接觸到其他油滴或者框子的邊界。必須等乙個油滴擴充套...
Luogu P1378 油滴擴充套件
題目描述 在乙個長方形框子裡,最多有n 0 n 6 個相異的點,在其中任何乙個點上放乙個很小的油滴,那麼這個油滴會一直擴充套件,直到接觸到其他油滴或者框子的邊界。必須等乙個油滴擴充套件完畢才能放置下乙個油滴。那麼應該按照怎樣的順序在這n個點上放置油滴,才能使放置完畢後所有油滴佔據的總體積最大呢?不同...