평행한 접힘선을 따라 접히는 팝업 카드에서 두 번째 선분이 존재하도록 x축 위의 접점 (Xp,0)을 옮겨야 하는 최소 거리를 구한다.
어려움8기하수학이분 탐색구현아직 제출이 없습니다시간 제한3초메모리 제한512 MB레이저 커터를 쉽게 구할 수 있게 되면서 팝업 카드를 다시 설계할 만해졌다. 이 문제는 그 설계 도구의 첫 버전이다.
카드는 평면 다각형 네 개를 접는 선 네 개로 이어 붙여 만든다. 네 접는 선은 접는 동안 언제나 서로 평행하다. 그 공통 방향을 z 방향이라고 하자. 그러면 구조 전체를 z=0 평면에 정사영해서 다룰 수 있으므로, 아래에서는 z 좌표를 적지 않는다.

카드의 두 면은 처음에 서로 90도를 이루고, 각각 x축의 양의 부분과 y축의 양의 부분으로 나타낸다. 두 면은 무한히 넓다고 본다. 접히는 구조는 제1사분면의 점 하나와 그 점을 두 면에 각각 잇는 선분 두 개다. 카드를 닫으면 두 면이 서로 가까워지도록 회전한다. 두 선분을 잘 고르면 구조는 도중에 걸리지 않고 평평하게 접히며, 접기가 끝나는 순간 두 면과 두 선분이 모두 한 직선 위에 놓인다. 면과 선분은 휘거나 늘어나거나 새로 접히거나 접는 선에서 떨어져서는 안 되고, 두 면 사이의 각은 90도를 넘지 않는다.
사용자는 x축 위의 점 (Xp,0)에서 제1사분면의 점 (Xa,Ya)까지 선분 하나를 그린다. 도구는 (Xa,Ya)에서 다른 면 위의 점 (0,Yp)까지 잇는 두 번째 선분을 찾는다. 여기서 Yp>0이고, 카드는 여전히 평평하게 닫혀야 한다. 그런 선분이 하나도 없으면 도구는 x축 위의 접점을 가장 짧은 거리만큼 옮겨서 선택지가 적어도 하나 생기게 한다. 그 거리를 구하라.
입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄이고, 공백 하나로 구분된 정수 Xa, Ya, Xp가 주어진다 (1≤Xa≤2000, 1≤Ya≤2000, 1≤Xp≤2000). 이 세 수는 사용자가 그린 선분, 즉 (Xp,0)에서 (Xa,Ya)까지의 선분을 나타낸다.
공백 하나로 구분된 0 세 개가 주어지는 줄이 나오면 입력이 끝난다. 테스트 케이스는 1500개 이하다.
각 테스트 케이스마다 Xp를 옮겨야 하는 가장 짧은 거리를 한 줄에 출력한다. 옮긴 뒤에는 (Xa,Ya)에서 Yp>0인 어떤 점 (0,Yp)까지 잇는 선분이 있어서 카드가 평평하게 닫혀야 한다.
조건을 만족하는 거리의 집합은 열린 집합일 수 있다. 그래서 구하는 값은 조건을 만족하는 거리가 얼마든지 가까이 존재하는 가장 작은 수로 정한다. 이 값을 소수점 아래 여섯 자리까지 출력한다.
첫 번째 예제 (Xa=1, Ya=1, Xp=1)가 그림에 나온 경우다. 아무것도 옮기지 않아도 된다. 그림에 점선으로 표시한 (1,1)에서 (0,1)까지의 선분을 그리면 구조가 평평하게 접힌다.
세 번째 예제 (Xa=5, Ya=4, Xp=20)에서는 7.5보다 크고 20보다 작은 거리라면 모두 유효한 카드가 되지만, 7.5 자체로는 되지 않는다. 유효한 거리가 7.5에 얼마든지 가까워지므로 답은 7.5다.