游泳池_纪中1439_二分+水

来源:互联网 发布:roseonly永生花 知乎 编辑:程序博客网 时间:2024/05/21 08:59

Description

  有一个游泳池,形状为等腰直角三角形,直角边长250米。
6  
  游泳池可以看作是在坐标系统中(如上图所示)。用一条两端点在三角形边上的线段把游泳池分成两个面积相同的部分。
  在给定线段其中一个端点的情况下,要你编程输出另一个端点。

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.
0 0
原创粉丝点击