2507:Crossed ladders
keyword
幾何 2分探索 C++
概要
x,y,cが与えられたときに?の部分を求める問題。
相似とか使えば厳密解が出そうな雰囲気はあるけど、面倒そうなので2分探索で。?が大きくなればcは下がり、小さくなればcは増えるという単調性を利用する。幾何と2分探索ってどうしてこう相性がいいのだろう。
int main(){ double x, y, c, high, low, mid; while(scanf("%lf%lf%lf",&x,&y,&c)!=EOF){ low = 0.0; high = min(x,y) - EPS; mid = 0.5*(low + high); while(high - low >= 1e-5){ mid = 0.5*(low + high); if(isLL(point(0.0,0.0), point(mid, sqrt(x*x-mid*mid)), point(0.0,sqrt(y*y-mid*mid)), point(mid, 0.0)).imag() > c){ low = mid; } else high = mid; } printf("%.3f\n", mid); } return 0; }