このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について意訳で説明する。
地下鉄の電車は人々をある駅から隣の駅へ高速に動かすことができる。二つの隣り合う駅について、lengthメートルであることが知られている。安全のため、電車はmaxVelocityメートル/秒よりも速く移動することは許されない。また、快適さのため、加速度の絶対値はmaxAccelerationメートル/秒^2を超えてはならないものとする。電車は0メートル/秒から動きだし、隣の駅で停車する(つまり駅に到着したときに0メートル/秒の速度になる)。隣の駅へ到着するのに必要な時間の最小値を返すようなメソッドを作成せよ。
私の解答はこちら。
public class Subway2 { public double minTime(int length, int maxAcceleration, int maxVelocity) { double toMax = maxVelocity * 1.0 / maxAcceleration; double s = maxVelocity * toMax; if( length < s ){ double half = length / 2.0; return Math.sqrt(half * 2 / maxAcceleration)*2; }else{ return toMax * 2 + (length - s) / maxVelocity; } } }
209.07/250、1回のsubmitでシステムテストクリア。高校の物理学に出てくる運動の問題ですね。最高速に達する(コード中の分岐では後半)か、達しない(コード中の分岐では前半)かで場合分けすると簡単です。
0 件のコメント:
コメントを投稿