分析
首先以离右侧墙距离为自变量得到的答案应该是一个单峰函数,考虑三分。
对于形成相似三角形的情况,直接用相似求解,
否则在墙上的影子实际上也是相似的,同样可以用类似的方法处理
代码
#include <cstdio>
#define rr register
using namespace std;
double h1,h2,D; int Test;
inline double calc(double x){
rr double ans=(D-x)/(h1-h2)*h2;
if (h2/h1<=x/D) return ans;
else return x+(ans-x)*h1/(ans-x+D);
}
signed main(){
for (scanf("%d",&Test);Test;--Test){
scanf("%lf%lf%lf",&h1,&h2,&D);
rr double l=0,r=D;
while (l+1e-6<r){
rr double z=(r-l)/3,lmid=l+z,rmid=r-z;
if (calc(lmid)<calc(rmid)) l=lmid;
else r=rmid;
}
printf("%.3lf
",calc(l));
}
return 0;
}