题目描述
一个街道两侧有两栋楼,现在有如图所示两楼梯 x,y。两个楼梯分别如图放置。
已知两个楼梯的长度和他们交点离地面的高度,求两栋楼之间的距离。
输入格式
一行三个实数,分别表示 x,y,c。
输出格式
输出共包含 1行。
即所求的两栋楼之间的距离,保留三位小数。
数据说明
0<a,b,c<2500
保证数据合法。
样例
输入样例:
30 40 10
输出样例:
26.033
经过分析发现,两栋楼之间的距离与两个楼梯的交点离地面的高度成单调性,就有一点想到可不可以用二分解决呢,看着很像一个数学题,但是出到编程题里了,就可能是用编程的思想解决的,看到具有单调性就想一下是否可以用二分呢
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
double c,x,y;
double check(double s){
double a=sqrt(x*x-s*s);
double b=sqrt(y*y-s*s);
if((a*b/(a+b))>c) return true;
else{
return false;
}
}
int main(int argc, char** argv) {
cin>>x>>y>>c;
double l=0,r=min(x,y);//三角形的性质:直角边一定小于第三边
while(r-l>1e-5){ //浮点二分模板
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.3lf",l);
return 0;
}