Crossed Ladders
Input: Standard Input
Output: Standard Output
Time Limit: 1 Second

Each line of input contains three positive floating point numbers giving the values of x, y, and c.
For each line of input, output one line with a floating point number giving the width of the street in feet, with three decimal digits in the fraction.
Sample Input Output for Sample Input
30 40 10 12.619429 8.163332 3 10 10 3 10 10 1 | 26.033 7.000 8.000 9.798 |
题意:给定两个梯子的长度x和y,求交点的高度为c时,梯子底部的距离是多少。
思路:用二分的方法,当已知这个距离的时候,求高度就很简单了。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double x,y,c,eps=1e-8;
double solve(double BD)
{
double D,B,ED;
D=acos(BD/x);
B=acos(BD/y);
ED=BD*sin(B)/sin(M_PI-D-B);
return ED*sin(D);
}
int main()
{
double l,r,mi;
while(~scanf("%lf%lf%lf",&x,&y,&c))
{
l=0;r=min(x,y);
while(r-l>eps)
{
mi=(l+r)/2;
if(solve(mi)>c)
l=mi;
else
r=mi;
}
printf("%.3f\n",l);
}
}