백준
백준 2022 사다리 (c++)
딴짓거리
2025. 2. 10. 15:38
정보가 부족해 수학적으로는 해를 구할 수 없는 문제이지만 이분탐색이라는 폭력적인 방법으로 해를 구해버린다
비례식으로 식을 구한 후 w(두 빌딩사이의 거리)를 이분탐색으로 찾는다
핵심은 빌딩이 멀어질수록(w가 커질수록) C는 작아지고
빌딩이 가까워질수록(w가 작아질수록) C는 커진다
double x, y, c;
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> x >> y >> c;
double high = min(x, y);
double low = 0.0f;
double ans = 0;
while (low+0.001f <= high)
{
double w = (low + high) / 2;
double h1 = sqrt(x * x - w * w);
double h2 = sqrt(y * y - w * w);
double tmp = (h1 * h2) / (h1 + h2);
if (tmp >= c)
{
ans = w;
low = w;
}
else
{
high = w;
}
}
cout << ans << endl;
}
W를 이분탐색으로 탐색하여 h1 h2를 구한 후 식에 대입하여 C와 비교한다.
계산한 값 tmp가 C보다 크다는 것은 구해진 건물의 거리가 너무 가깝다는 뜻이므로 올려주고
반대이면 내려준다