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,问两栋楼之间的距离。
这是一个几何题。设宽度为w,交点距左楼距离为a,则根据三角形相似可以推出:
把第二个式子代入第一个式子可以得出一个等式,把方程左边写成关于w的函数,求导可得是减函数。因为w一定小于x,y中的最小值(三角形的直角边小于斜边),二分求出答案即可。
#include<cstdio>
#include<cmath>
#include<algorithm>
#define Min(a,b) a <= b ? a : b;
using namespace std;
double x, y, c;
double get_ans(double w)
{
return 1 - c / sqrt(x * x - w * w) - c / sqrt(y * y - w * w);
}
int main()
{
while(~scanf("%lf%lf%lf",&x,&y,&c))
{
double l = 0, mid, r = Min(x,y);
while(r - l > 1e-8)
{
mid = (l + r) / 2;
if(get_ans(mid) > 0)
l = mid;
else
r = mid;
}
printf("%.3lf\n",mid);
}
return 0;
}