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

55 篇文章 0 订阅
53 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值