本来想推公式,结果推了半天都没推出来。然后一转思路,二分w的长度,一会就A了。不难计算出交点离地面的距离:
h=sqrt(x*x-w*w)*sqrt(y*y-w*w)/(sqrt(x*x-w*w)+sqrt(y*y-w*w),然后与c比较就行了。
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
double x,y,c;
const double eps=1e-8;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
else return x<0?-1:1;
}
int main()
{
freopen("in.txt","r",stdin);
while(cin>>x>>y>>c)
{
double L=0,R=min(x,y);
while(dcmp(L-R)<0)
{
double w=(L+R)/2;
double tmp=sqrt(x*x-w*w)*sqrt(y*y-w*w)/(sqrt(x*x-w*w)+sqrt(y*y-w*w));
if(dcmp(tmp-c)>0) L=w;
else R=w;
}
printf("%.3f\n",R);
}
return 0;
}