游泳池 纪中 1439 数学+二分
Description
有一个游泳池,形状为等腰直角三角形,直角边长250米。
游泳池可以看作是在坐标系统中(如上图所示)。用一条两端点在三角形边上的线段把游泳池分成两个面积相同的部分。
在给定线段其中一个端点的情况下,要你编程输出另一个端点。
Input
输入第一行包含两个整数,表示线段一个端点的坐标,保证给定的端点在直角三角形的边上。
Output
输出线段另一个端点的坐标,答案保留2位小数。
分析
水题就要水过对不对。
分情况讨论,二分找到边长,然后用秦九韶公式算面积,和另一半比较,相同就可以输出了。
计算坐标即可。(具体见程序*n)
这里还有一个更高级的方法,纯数学——梓豪
代码
const
ge=1.4142135623730950488016887242097;
s=250*250/2;
xb=sqrt(250*250*2);
var
n,m:Longint;
l,r,w,ll,mid:real;
procedure tepan(n,m:longint);
begin
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;
end;
function qin_jiu_shao(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
qin_jiu_shao:=p*(p-a)*(p-b)*(p-c);
qin_jiu_shao:=sqrt(qin_jiu_shao);
end;
begin
readln(n,m);
tepan(n,m);
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:=qin_jiu_shao(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:=qin_jiu_shao(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:=250;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(mid)+sqr(m);
w:=sqrt(w);
ll:=qin_jiu_shao(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:=250;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(mid)+sqr(n);
w:=sqrt(w);
ll:=qin_jiu_shao(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<125) and (m>125)
then
begin
l:=0;
r:=250;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(m)+sqr(mid-n);
w:=sqrt(w);
ll:=qin_jiu_shao(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');
halt;
end;
if (n>125) and (m<125)
then
begin
l:=0;
r:=250;
while l<=r do
begin
mid:=(l+r)/2;
w:=sqr(n)+sqr(mid-m);
w:=sqrt(w);
ll:=qin_jiu_shao(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;
end.