April 07, 2021 ( last updated : April 07, 2021 )
수학
이분 탐색
기하학
선형대수학
피타고라스 정리
알고리즘
https://github.com/sneakstarberry/
[백준] 2022번 사다리
x, y 그리고 이 둘이 교차하는 높이 c 이 세개의 값을 통해서 건물 사이의 길이(w)를 구한다.
x, y 직각 삼각형의 대각선으로 피타고라스의 정리를 통해서 나머지 높이와 밑변의 길이를 추측할 수 있습니다.
그리고 나머지는 c로 인해서 x,y의 직각삼각형 내부에 작은 삼각형이 나오는데 해당 삼각형의 높이과 밑변의 비는 각각 x와 y 삼각형의 높이와 밑변의 비와 대응 됩니다.
이를 통해서 우리가 구해야하는 답 건물 사이의 길이(w)를 구할 수 있게 됩니다.
h1^2 = x^2 + w^2 h2^2 = y^2 + w^2 c = (h1 * h2) / (h1 + h2)
위의 식을 통해 우리는 w를 추측하고 실제 가지고 있는 값인 c 와 비교함으로서 값을 구할 수 있다. 이때 이분탐색 알고리즘을 이용합니다. 일반적으로 왼쪽 값을 +1 그리고 오른쪽 값을 -1 해주는데 해당 값은 정수가 아닌 실수 값이므로 0.00001씩 변화를 주어가며 w 값을 구해줍니다.
#include <cmath>
#include <iostream>
using namespace std;
double X, Y, C;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin.precision(7);
cin >> X >> Y >> C;
double answer;
double h, l, m;
h = min(X,Y);
l = 0;
m = (h + l) / 2;
while (l + 0.00001 < h) {
m = (h + l) / 2;
double high1 = pow(X, 2) - pow(m, 2);
double high2 = pow(Y, 2) - pow(m, 2);
double assume_c = (sqrt(high1) * sqrt(high2)) / (sqrt(high1) + sqrt(high2));
if (assume_c <= C) {
answer = m;
h = m;
} else {
l = m;
}
}
cout << fixed;
cout.precision(3);
cout << answer;
}
Originally published April 07, 2021
Latest update April 07, 2021
Related posts :