p2335.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 78 行

PAS
78
字号
PROGRAM p2335;

CONST
        infinity=1e10;
        small=1e-9;

TYPE
        Circle=record
                x,y,r                           :Extended;
        end;

VAR
        f                                               :Text;
        ans,temp                                :Extended;
        part,p,i                                :Integer;
        data                                    :array[1..3]of Circle;

FUNCTION Find(down,up:Extended;var r,a,b,t:Extended):Extended;
var
        mid,temp                                :Extended;
        com1,com2                               :Extended;
begin
if abs(down-up)<small then
        begin
        find:=up;
        exit;
        end;
mid:=(up+down)/2;
temp:=(down+mid)/2;

com1:=sqrt(sqr(a)+sqr(r)-2*cos(mid)*a*r)+sqrt(sqr(b)+sqr(r)-2*cos(t-mid)*b*r);
com2:=sqrt(sqr(a)+sqr(r)-2*cos(temp)*a*r)+sqrt(sqr(b)+sqr(r)-2*cos(t-temp)*b*r);

if com2<com1 then Find:=Find(down,mid,r,a,b,t)
        else Find:=Find(temp,up,r,a,b,t);

end;

FUNCTION Maxget(mid,left,right:Circle):Extended;
var
        a,b,c                                   :Extended;
        jiao,x,sure                             :Extended;
begin
a:=sqrt(sqr(mid.x-left.x)+sqr(mid.y-left.y));
b:=sqrt(sqr(mid.x-right.x)+sqr(mid.y-right.y));
c:=sqrt(sqr(left.x-right.x)+sqr(left.y-right.y));
x:=(sqr(a)+sqr(b)-sqr(c))/a/b/2;
{if x<0 then
        begin
        Maxget:=c-left.r-right.r;
        exit;
        end;}
jiao:=ArcTan(sqrt(1-sqr(x))/x);
if jiao<small then jiao:=jiao+pi;
sure:=Find(0,jiao,mid.r,a,b,jiao);
Maxget:=sqrt(sqr(a)+sqr(mid.r)-2*cos(sure)*a*mid.r)+sqrt(sqr(b)+sqr(mid.r)-2*cos(jiao-sure)*b*mid.r)-left.r-right.r;
end;


BEGIN
//assign(input,'p.in');
//reset(input);
readln(part);
for p:=1 to part do
        begin
        for i:=1 to 3 do with data[i] do read(data[i].x,data[i].y,data[i].r);
        readln;
        ans:=infinity;
        temp:=Maxget(data[1],data[2],data[3]);
        if temp<ans then ans:=temp;
        temp:=Maxget(data[2],data[1],data[3]);
        if temp<ans then ans:=temp;
        temp:=Maxget(data[3],data[1],data[2]);
        if temp<ans then ans:=temp;
        ans:=ans+2*pi*(data[1].r+data[2].r+data[3].r);
        writeln(ans:0:3);
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?