游泳池 纪中 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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值