본문 바로가기
ps

[백준] 2022 - 사다리

by kariskan 2023. 2. 14.

https://www.acmicpc.net/problem/2022

 

2022번: 사다리

첫째 줄에 차례대로 x, y, c에 해당하는 양의 실수 세 개가 입력된다. 수는 소수점 여섯째 자리까지 주어질 수 있으며, 3,000,000,000보다 작거나 같다.

www.acmicpc.net

 

기하학이 가미된 이분 탐색 문제였다.

그림이 좀 이상하지만, x와 y가 만나는 교점과 mid의 양 끝점을 세 점으로 하는 삼각형의 넓이를 살펴보자.

우리는 mid값을 구하기 위해 파라매트릭 서치로 이분 탐색을 사용할 것이고, 매 반복마다 mid 값으로 A, B값을 구할 수 있을 것이다(via 피타고라스 정리).

 

한 편 빨간색 삼각형의 넓이 S = c * mid / 2 이다.

이 삼각형의 넓이를 A, B, c로도 구할 수 있다.

바로 빨간색 삼각형의 오른쪽 부분과, A * mid / 2를 넓이로 하는 삼각형의 넓이의 비는

c * c : A * A이기 때문이다. 똑같이 오른쪽 삼각형도 적용해 주면,

빨간색 삼각형의 넓이 c * mid / 2 = (mid * B / 2) * (c * c) / (B * B) + (mid * A / 2) * (c * c) / (A * A)

각 항을 정리해 주면, 1 = (c / A) + (c / B)라는 식이 도출된다.

mid가 작아지면 A, B가 커지고, mid가 커지면 A, B가 작아지므로 mid 값 하나로 이분탐색을 수행해 답을 구할 수 있다.

 

#include <iostream>
#include <cmath>
using namespace std;

double x, y, c;

int main()
{
	cin >> x >> y >> c;
	double ans = 0;
	double left = 0, right = min(x, y);
	for (int i = 0; i < 10000; i++)
	{
		double mid = (left + right) / 2;
		double yy = sqrt(y * y - mid * mid);
		double xx = sqrt(x * x - mid * mid);
		if (c / yy + c / xx >= 1)
		{
			ans = mid;
			right = mid - 0.0000000001;
		}
		else
		{
			left = mid + 0.0000000001;
		}
	}
	printf("%0.3lf", ans);
}

'ps' 카테고리의 다른 글

[백준] 1765 - 닭싸움 팀 정하기  (0) 2023.06.20
[백준] 16400 - 소수 화폐  (0) 2023.02.14
[백준] 2982 - 국왕의 방문  (0) 2023.01.22
[백준] 2307 - 도로검문  (0) 2023.01.21
[백준] 4315 - 나무 위의 구슬  (0) 2023.01.17

댓글