C - パニクるな Editorial /

Time Limit: 2 sec / Memory Limit: 64 MB

問題文

アーサーとフォードは無事に地表に降り立つことができた.しかし,この惑星は未開の惑星で,空を飛ぶための特訓や英会話の練習くらいしかやることが無かった.暇になったアーサーは,ちょうど手元に持っていた宇宙共通海抜高度計と初速度 v 角度45度で入れたものを発射できる大砲を使って,現在地の高さ h と初速度 v とこの惑星の重力 g を調べることにした.
具体的には t 秒後に海抜高度計が高さを記録するようにして,その海抜高度計をタオルに包んで丸めて入れて大砲に入れる.そして,すぐさまこのタオルを発射し,t 秒後のタオルの高さ y を記録する.これを何度か繰り返して間接的にh, v, gを調べるのだ.

さて準備はととのった.あとは t をどのようにセットするかを考えるだけだ.

入出力形式

入力は全て小数12桁までの実数で与えられる.

アーサーはタオルを大砲に入れ発射し t 秒後にタオルの海水面からの高さを調べるか,もしくは,現在地の高さ h と大砲からタオルが発射される時の初速度 v とこの惑星の重力 g を確定させることができる.

タオルを大砲に入れ発射し t 秒後に海抜高度計を使って観測を行うには

printf("? %.12f\n", t); fflush(stdout);
とする.次に,
scanf("%lf", &y);
とすると発射されてから t 秒後のタオルの海水面からの高さが得られる.
もしも t \lt 0 または 1000 \lt t となるような時間をセットすると実際の高さにかかわらず y には -1 が入る.

現在地の高さ h と大砲からタオルが発射される時の初速度 v とこの惑星の重力 g を確定させるには

printf("! %.12f %.12f %.12f\n", h, v, g); fflush(stdout);
とする.
このとき,h, v, g がそれぞれの実際の値との絶対誤差がで 10^{-5} 以下になっていなければならない.
なお,上記以外の出力を行った場合は誤答(Wrong Answer)と判定される.

制約

  • 0h10^4
  • 0.1v1,000
  • 0.1g < 100
  • 入力値は全て小数12桁までの実数である.
  • タオルを大砲に入れ発射することを最大 10 回まで行える.それを越えると大砲が壊れて使えなくなり,誤答(Query Limit Exceeded)となる.
  • yy = -gt^2/2 + vt / \sqrt{2}+ h という等式を満たす.

入出力例

プログラムの出力プログラムへの入力
? 1.41
10.192110797
? 2.71
2.31467840781
? 3.14
-3.93851731148
! 0.000000 20.000000 9.806650

プログラムはまず初めにタオルが発射されてから 1.41 秒後にタオルの高さを調べるように海抜高度計をセットしている.
その結果,発射されてから 1.41 秒後にはタオルの海面からの高さは 10.19 という事が分かる.
その後何度か調査を行い,最終的に現在地の高さ h は 0,タオルの初速度 v は 20,この惑星の重力加速度 g は 9.80665 と結論づけている


Writer : 花田裕一朗
Tester : 楠本充,森槙悟

Source Name

KUPC 2012 Practice