如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
URAL/1075
来自"NOCOW"
< URAL
直接用解析几何的方法。
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
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.