2012年3月27日火曜日

TopCoder SRM145 Div2 500Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。

あなたは運動機器のファームウェアプログラムを書いている。1秒ごとに作業が何パーセント終わったかを表示するか決めるルーチンが呼び出されている。ディスプレイは小数点以下は表示できないので、全体の運動に対してちょうどのパーセンテージになったとき(=整数で表示できるとき)のみ、ルーチンはディスプレイにパーセンテージを表示する。
timeという運動を続ける時間が"hh:mm:dd"の形式で与えられたとき、ルーチンにより何度パーセンテージがディスプレイに表示された回数を返すメソッドを作成せよ。なお、この機械は0%と100%は表示しないものとする。

例えば30分(=1800秒)は99回表示する。18秒ごとに表示すれば1%ずつ進捗状況を表示できるからである。

私の解答はこちら。

public class ExerciseMachine {

 public int getPercentages(String time) {
  String[] t = time.split(":");
  int hours = Integer.parseInt(t[0]);
  int minutes = Integer.parseInt(t[1]);
  int seconds = Integer.parseInt(t[2]);
  seconds += hours * 3600;
  seconds += minutes * 60;
  int nDisp = 0;
  // 何パーセントごとに表示しうるかを求める
  // 100 / 1 = 100, 100 / 2 = 50, ... , 100 / 10 = 10まで求めれば
  // 返り値の候補が以下のようになることがわかる。
  // 33.3%ごとに表示されてしまうため、100 / 3 などはダメ。
  int[] candidates = {1, 2, 4, 5, 10, 20, 25, 50, 100};
  for( int i=0 ; i<candidates.length ; i++ ){
   if( seconds % candidates[i] == 0 ) nDisp = candidates[i]-1;
  }
  return nDisp;
 }

}

得点は418.00/500、1回のsubmitでシステムテストクリア。timeが与えられたときに、きれいに何パーセント終了したという状態が表示できる回数の最大値を求めよということらしい。解候補がcandidatesしかないという決め打ちによる回答はほとんどないようでした。解答よりも問題文の理解に時間がかかりました。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計