#三分#洛谷 5931 [清华集训2015]灯泡 分析 代码

题目传送门


首先以离右侧墙距离为自变量得到的答案应该是一个单峰函数,考虑三分。

对于形成相似三角形的情况,直接用相似求解,

否则在墙上的影子实际上也是相似的,同样可以用类似的方法处理


代码

#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;
}