カメヲラボ

主にプログラミングとお勉強全般について書いてます

Crossed ladders(0)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2507
二つの建物の間に二つのはしごが掛かっている。与えられた条件は、2つのはしごの長さとはしごが交差する点の、地面からの高さ。求めるのは、建物の間の距離だ。statusを見る限り、全体的に短いコードで通っているのでやってみたのだがうまくいかない。
答えを求めるために方程式を作ってみたのだが、√が含まれているので消そうとすると次数が上がってしまい「???」となる。とりあえず解析的に解いてAcceptされたが、もっとスマートに解けないものか・・・。数学の得意な人求む。

とりあえず、特に短縮していないコードを載せておきますかね。

double a,b,c,l,r,s,w,x,y,z;
main(){
	for(;s=~scanf("%lf%lf%lf",&a,&b,&c);l=!printf("%.3f\n",w))
		for(r=a>b?b:a;fabs(s-c)>1e-7;s<c?r:l=w)
			w=(l+r)/2,
			x=sqrt(a*a-w*w),y=sqrt(b*b-w*w),
			s=x*y/(x+y);
}