$O(t\lg L)$ // L: 탐색구간 크기
떨어진 거리 d라 할 때 f(d)를 교점의 높이라 하자.
왼쪽 빌딩 교점의 높이: a
오른쪽 빌딩 교점의 높이: b
a=sqrt(x*x-d*d)
b=sqrt(y*y-d*d)
f(d)=a*b/(a+b)
y=f(x)는 감소함수 이므로 파라매트릭 서치를 통해 본 문제를 해결할 수 있다.
#include<cstdio> #include<algorithm> using namespace std; double x, y, c; int main() { while (~scanf("%lf%lf%lf", &x, &y, &c)) { double low = 0, up = min(x, y), m; for (int i = 0; i < 100; i++) { m = (low + up) / 2; 1 / c < 1 / sqrt(x*x - m*m) + 1 / sqrt(y*y - m*m) ? up = m : low = m; } printf("%.3lf\n", m); } return 0; }
댓글 없음 :
댓글 쓰기