kmjp's blog

競技プログラミング参加記です

KUPC2012 Practice : C - パニクるな

さてC。
http://kupc2012pr.contest.atcoder.jp/tasks/kupc2012pr_3

問題

今宇宙船が重力加速度gの惑星の高度hにある。
この宇宙船から初速度vで機械を撃ちだすことができる。
ここでtを入力すると、機械のt秒後の高度を返す。
この機械の高度yが、y=\frac{-gt^2}{2}+\frac{vt}{\sqrt2}+hで表せられるとき、g,v,hを答えよ。
なお、機械は最大10回までしか撃ちだせない。

解法

変数は3つなので、3回クエリを実行すればよい。
例えばt=0,1,2を入力した返り値y0,y1,y2を使うと以下の3式が得られる。

  • y0 = h
  • y1 = \frac{-g}{2}+\frac{v}{\sqrt2}+h
  • y2 = -2g + \sqrt2v+h

あとは方程式を解くだけ。

double answer(double t) {
	double res;
	printf("? %.12f\n", t);
	fflush(stdout);
	scanf("%lf", &res);
	return res;
}

void solve() {
	int f,r,i,j,k,l,x,y,tx,ty;
	double v1,v2;
	double h,v,g;
	
	h=answer(0);
	v1=answer(1);
	v2=answer(2);
	g=(h-v2)-2*(h-v1);
	v=(2*(h-v1)-g)*(-1/sqrt(2));
	printf("! %.12f %.12f %.12f\n", h, v, g); fflush(stdout);
	
	return;
}

まとめ

クエリ系の問題としては簡単。