백준

백준 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보다 크다는 것은 구해진 건물의 거리가 너무 가깝다는 뜻이므로 올려주고

반대이면 내려준다