Description
有一个游泳池,形状为等腰直角三角形,直角边长250米。
游泳池可以看作是在坐标系统中(如上图所示)。用一条两端点在三角形边上的线段把游泳池分成两个面积相同的部分。
在给定线段其中一个端点的情况下,要你编程输出另一个端点。
Input
输入第一行包含两个整数,表示线段一个端点的坐标,保证给定的端点在直角三角形的边上。
Output
输出线段另一个端点的坐标,答案保留2位小数。
分析
水题就要水过对不对
分情况讨论,二分找到边长,计算坐标即可
code
const
s=250*250/2;
xb=sqrt(250*250*2);
ge=1.4142135623730950488016887242097;
var
n,m:Longint;
l,r,w,ll,mid:real;
function hellen(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
hellen:=p*(p-a)*(p-b)*(p-c);
hellen:=sqrt(hellen);
end;
begin
readln(n,m);
if (n=0)and(m=125) then
begin
writeln('250.00 0.00');
halt;
end;
if (n=125)and(m=0) then
begin
writeln('0.00 250.00');
halt;
end;
if (n=250)and(m=0) then
begin
writeln('0.00 125.00');
halt;
end;
if (n=0)and(m=250) then
begin
writeln('125.00 0.00');
halt;
end;
if (n=0)and(m=0) then
begin
writeln('125.00 125.00');
halt;
end;
if (n=125)and(m=125) then
begin
writeln('0.00 0.00');
halt;
end;
if (n=0)and(m<125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(m-mid/ge)+sqr(250-mid/ge);
w:=sqrt(w);
ll:=hellen(250-m,xb-mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll>s/2 then
l:=mid
else
r:=mid;
end;
writeln(250-mid/ge:0:2,' ',mid/ge:0:2);
halt;
end;
if (m=0)and(n<125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(n-mid/ge)+sqr(250-mid/ge);
w:=sqrt(w);
ll:=hellen(250-n,xb-mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll>s/2 then
l:=mid
else
r:=mid;
end;
writeln(mid/ge:0:2,' ',250-mid/ge:0:2);
halt;
end;
if (n=0)and(m>125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(mid)+sqr(m);
w:=sqrt(w);
ll:=hellen(m,mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll>s/2 then
r:=mid
else
l:=mid;
end;
writeln(mid:0:2,' 0.00');
halt;
end;
if (m=0)and(n>125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(mid)+sqr(n);
w:=sqrt(w);
ll:=hellen(n,mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll>s/2 then
r:=mid
else
l:=mid;
end;
writeln(mid:0:2,' 0.00');
halt;
end;
if (n<>0)and(m<>0)and(n>125)and(m<125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(n)+sqr(mid-m);
w:=sqrt(w);
ll:=hellen(xb-m*ge,250-mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll<s/2 then
r:=mid
else
l:=mid;
end;
writeln('0.00 ',mid:0:2);
halt;
end;
if (n<>0)and(m<>0)and(n<125)and(m>125) then
begin
l:=0;
r:=xb;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(m)+sqr(mid-n);
w:=sqrt(w);
ll:=hellen(xb-n*ge,250-mid,w);
if abs(ll-s/2)<=0.0001 then
break;
if ll<s/2 then
r:=mid
else
l:=mid;
end;
writeln(mid:0:2,' 0.00');
end;
end.