행성 표면을 탐사하는 새로운 방식으로 관측 탄환이라고 부르는 발사체를 쓴다. 탄환에는 스스로 움직이는 장치가 없고, 그래서 로버형 탐사 장비보다 비용이 훨씬 적게 든다.
탄환은 발사기에서 초기 속도를 받아 튀어 나간 다음, 지면에 닿을 때까지 포물선을 그린다. 지면에서 튕기면 다시 포물선을 그리고, 이 과정을 사실상 무한히 반복한다.
우리는 탄환이 행성 표면의 목표 지점에서 정확히 튕기도록 초기 속도를 맞추려고 한다. 튕기는 순간에 탄환 안의 여러 센서가 자료를 모아 관측 기지로 보낸다. 보통의 표적 사격처럼 들리지만 어려운 점이 몇 가지 있다.
임무를 완수하는 데 필요한 최소 초기 속력을 구하는 프로그램을 작성하라.
다음을 가정한다.
따라서 탄환은 완전한 포물선 궤적을 따라 난다.
다음도 가정한다.
강체 운동의 기본을 정리한다.
탄환의 속도 v를 수평 성분 vx와 수직 성분 vy로 나누어 쓴다. 위쪽이 양수다. 초기 속도의 성분은 vix와 viy이고, 발사 직후에는 vx=vix, vy=viy가 성립한다. 시각 t에서 발사기로부터의 수평 거리를 x, 고도를 y로 쓴다.
공기 저항을 무시하면 수평 속도 성분은 비행 내내 일정하다. 그래서 발사기로부터의 수평 거리는 흐른 시간에 비례한다.
x=vixt
수직 속도 성분 vy는 중력 때문에 점점 줄어든다. 중력 가속도가 g일 때 비행 중에 다음 미분 방정식이 성립한다.
dtdvy=−g
t=0일 때 vy=viy, y=0이라는 초기 조건으로 풀면 다음을 얻는다.
y=−21gt2+viyt=−(21gt−viy)t
이 식은 탄환이 t=2viy/g에 다시 지면에 닿는다는 뜻이다. 그러므로 튕기는 지점은 발사기에서 2vixviy/g만큼 떨어져 있다. 다시 말해 탄환을 거리 l만큼 날리려면 초기 속도의 두 성분이 2vixviy=lg를 만족해야 한다.
위 두 식에서 매개변수 t를 없애면 탄환의 포물선 궤적을 나타내는 식을 얻는다.
y=−2vix2gx2+vixviyx
계산을 쉽게 하려고 이 문제는 특별한 단위계를 쓴다. 이 단위계에서 행성의 중력 가속도 g는 정확히 1.0이다.
입력은 테스트 케이스 하나로 이루어지며, 형식은 다음과 같다.
d n b
p1 h1
p2 h2
.
.
.
pn hn
첫 줄에 정수 d, n, b가 주어진다. d는 발사기에서 목표 지점까지의 거리이고 (1≤d≤10000), n은 장애물의 개수이며 (1≤n≤10), b는 허용되는 최대 튕김 횟수다 (0≤b≤15). 목표 지점에서 튕기는 것은 이 횟수에 넣지 않는다.
이어지는 n개 줄에는 각각 정수가 두 개 있다. k번째 줄의 pk는 k번째 장애물의 위치, 즉 발사기로부터의 거리이고, hk는 지면에서 잰 높이다. k=1,…,n−1에 대해 0<p1, pk<pk+1이고, pn<d이다. 또 k=1,…,n에 대해 1≤hk≤10000이다.
탄환을 목표 지점에 도달하게 하는 가장 작은 초기 속력 vi를 출력한다. 탄환의 초기 속력은 다음과 같이 정의한다.
vi=vix2+viy2
값을 소수점 아래 여섯째 자리에서 반올림해서, 소수점 아래 자리가 정확히 다섯 개인 형태로 한 줄에 출력한다.