如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1075

来自"NOCOW"

跳转到: 导航, 搜索

直接用解析几何的方法。

program cao;
uses
  math;
 
var
  a1,a2,a3,b1,b2,b3,c1,c2,c3,a,b,c,e,f,g,h,i,j,k,l,n,m,p,q,r,d,d1,d2,d3:extended;
 
begin
  read(a1,a2,a3,b1,b2,b3,c1,c2,c3,r);
  d:=sqrt(sqr(b1-a1)+sqr(b2-a2)+sqr(b3-a3));
  d1:=sqrt(sqr(a1-c1)+sqr(a2-c2)+sqr(a3-c3));
  d2:=sqrt(sqr(b1-c1)+sqr(b2-c2)+sqr(b3-c3));
  c:=arccos((sqr(d1)+sqr(d2)-sqr(d))/(2*d1*d2));
  a:=arccos(r/d1);
  b:=arccos(r/d2);
  if a+b>=c then
    writeln(d:0:2)
  else
    writeln((c-a-b)*r+sqrt(sqr(d1)-sqr(r))+sqrt(sqr(d2)-sqr(r)):0:2);
end.

http://www.withflying.com/?p=137

http://www.withflying.com



program ural1075;
const
  dimen=3;
  zero=1e-6;
type
  dot=array[1..dimen]of real;
var
  a,b,c:dot;
  r,x,y,z,t,d,ans:real;
procedure readdot(var a:dot);
  var
    i:byte;
  begin
    for i:=1 to dimen do
      read(a[i]);
  end;
function dist(a,b:dot):real;
  var
    d:real;
    i:byte;
  begin
    d:=0;
    for i:=1 to dimen do
      d:=d+sqr(a[i]-b[i]);
    dist:=sqrt(d);
  end;
function arccos(c:real):real;
  begin
    if abs(c)<zero then
      arccos:=pi/2
    else if c>0 then
      arccos:=arctan(sqrt(1-c*c)/c)
    else
      arccos:=pi+arctan(sqrt(1-c*c)/c);
  end;
begin
  readdot(a);readdot(b);readdot(c);read(r);
  x:=dist(a,c);y:=dist(b,c);z:=dist(a,b);
  if (x*x+z*z<=y*y) or (y*y+z*z<=x*x) then
    ans:=z
  else begin
    t:=arccos((x*x+y*y-z*z)/(2*x*y));
    d:=x*y*sin(t)/z;
    if d>=r then ans:=z else ans:=sqrt(x*x-r*r)+sqrt(y*y-r*r)+r*(t-arccos(r/x)-arccos(r/y));
  end;
  writeln(ans:0:2);
end.
个人工具