UVA10649 Danger Point 题解

· · 题解

Update by 2023102 日:

修改了部分错误,删除了代码中多余部分。

这个题因为UVA的传统艺能让我WA了好几次

翻译

我们过 A 点做 AG \perp CDCDH 点,连接 GF,AF,EF,GE,GB

\because AG \perp CD \therefore \angle AHF = \angle GHF = 90^\circ \therefore AH=HG \because \begin{cases}AH=GH\\\angle AHB = \angle GHB\\HB=HB\end{cases} \therefore \triangle AHB \cong \triangle GHB(SAS) \therefore AB=GB,\angle ABH = \angle GBH \because \angle ABH= 45^\circ \therefore \angle ABG = \angle ABH + \angle GBH = 45^\circ + 45^\circ = 90^\circ \therefore \angle GBE=90^\circ \therefore GE^2=GB^2+BE^2 \because \angle HAB = 180^\circ - \angle ABH - \angle AHB = 180^\circ - 45^\circ - 90^\circ = 45^\circ,\overset{\frown}{GE}=\overset{\frown}{GE} \therefore \angle GFE = 2\angle GAE = 2 \times 45^\circ = 90^\circ \therefore GE^2=GF^2+EF^2 \because GF=EF \therefore 2GF^2=AB^2+BE^2 \therefore \sqrt{2GF^2-AB^2} =BE

2GF^2-AB^2 \le 0 则无解,输出 INCORRECT INFORMATION !!!

Code:

#include<bits/stdc++.h>
using namespace std;
bool ok=true;
int main()
{
    while(ok)
    {
        double x,y;
        cin>>x>>y;
        if(x==0&&y==0)
            return 0; 
        double r=x/2,l=y;//半径为直径的一半
        double ans,ans1;
        ans1=2*r*r-l*l;
        if(ans1<=0)
          cout<<"INCORRECT INFORMATION !!!"<<endl;
        else
        {
            ans=sqrt(ans1);
            printf("%.6lf",ans);
            cout<<endl;
        }
    }
   return 0;
}