2006년 가을 USC 공과대학은 공학 100주년을 기념했고, 그때 열린 대회의 이름이 100 Years of Engineering이었다. 이 문제는 그 대회의 항공우주공학과 기계공학 문제다. 로켓을 만들어 쏘아 올렸다면, 다시 떨어지기 전에 얼마나 높이 올라가는지 알고 싶어진다.
로켓은 n개의 단으로 이루어져 있고, 각 단은 연료 탱크다. 단 i는 ti초 동안 연소하면서 추력 Fi를 내고, 연료가 떨어지는 순간 분리되어 버려진다. 마지막 단까지 버리고 나면 로켓은 더 이상 가속하지 못한다.
로켓 본체의 질량은 M킬로그램이다. 즉 모든 단을 버리고 남는 질량이 M이다. 단 i의 질량은 mi이고, 연료 자체의 질량은 0으로 본다. 그래서 처음 로켓의 질량은 M+∑imi이고, 단 i가 연소하는 동안의 질량은 M+mi+mi+1+⋯+mn이다. 이미 분리한 단은 무게에서 빠진다.
로켓은 똑바로 위로 발사되고, 처음 속도는 0m/s다. 바람, 마찰, 지구 중력장 이탈 같은 효과는 모두 무시한다.
필요한 물리 공식은 세 가지다.
따라서 단 i가 연소하는 동안 로켓의 위쪽 방향 가속도는 Fi/m−g로 일정하다. 여기서 m은 그 연소 구간에서의 로켓 질량이다. 이 값이 음수이면 로켓은 감속하거나 아래로 내려온다.
단은 1,2,…,n 순서로 쓰고 버린다. 마지막 단이 떨어져 나가는 순간 로켓이 있던 높이를 구한다. 입력은 항상 로켓이 이륙하고, 마지막 단을 버리기 전에는 지면에 부딪히지 않도록 주어진다.
첫 줄에 데이터 세트의 개수 K≥1이 주어진다. 이어서 K개의 데이터 세트가 다음 형식으로 주어진다.
각 데이터 세트의 첫 줄에는 단의 개수 n과 로켓 본체의 질량 M이 주어진다. n은 1≤n≤30인 정수이고, M은 0.01≤M≤1,000,000인 실수다.
다음 n개의 줄에는 각각 세 실수 mi, ti, Fi가 주어지며, 셋 다 0.01 이상 1,000,000 이하다. mi는 단 i의 질량(kg), ti는 연소 시간(초), Fi는 그동안 내는 추력이고 단위는 kgm/s2이다.
각 데이터 세트마다 먼저 Data Set x:를 한 줄에 출력한다. x는 데이터 세트의 번호로 1부터 센다. 다음 줄에 마지막 단이 떨어져 나갔을 때 로켓의 높이를 소수점 아래 둘째 자리까지 반올림해서 출력한다.
각 데이터 세트 뒤에는 빈 줄을 하나 출력한다.