Baekjoon/Silver
C++ / 백준 / 2022 / 사다리
GitHubSeob
2021. 8. 20. 21:23
문제
https://www.acmicpc.net/problem/2022
2022번: 사다리
첫째 줄에 차례대로 x, y, c에 해당하는 양의 실수 세 개가 입력된다. 수는 소수점 여섯째 자리까지 주어질 수 있다.
www.acmicpc.net


문제풀이

닮음을 이용하여 풀었다.

왼쪽 삼각형


오른쪽 삼각형






라는 식을 얻을 수 있다.
또 피타고라스 정리에 의해서


이후에 양변을 루트를 씌우면 h1, h2의 식을 구할 수 있다.
우리는 w1+w2인 값을 구해야한다.
이분탐색을 이용하여 이 값을 구한다.
w1+w2를 이분탐색의 mid값으로 두고, h1과 h2값을 구하고 h1*h2/(h1+h2)값과 c값을 비교하면서
문제에 나온 오차가 10^-3 이하로 나오도록 조건을 건다.
코드
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
double x = 0, y = 0, c = 0;
cin >> x >> y >> c;
double left = 0, right = min(x, y);
while (right - left >= 1e-3) {
double width = (left + right) / 2;
double height1 = sqrt(pow(x, 2) - pow(width, 2));
double height2 = sqrt(pow(y, 2) - pow(width, 2));
double num = height1 * height2 / (height1 + height2);
if (num < c)
right = width;
else left = width;
}
cout << fixed;
cout.precision(3);
cout << right;
}