2012年4月5日木曜日

TopCoder SRM362 Div2 250Pts

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

1からNまで番号を時計回りにつけられたN人の友人が円状に座っている。ゲームははじめ、プレーヤ1がボールを受け取る。プレーヤーはボールを互いに渡しあう。渡し合う際には次の行動が行われる。もし、プレーヤーがM回ボールを受け取ったならゲームは終了である。そうでない場合、もしプレーヤーがp回受け取っていたなら、pが奇数であれば右、偶数であれば左へL人先の人にボールを渡す。N、M、Lが与えられたとき、ボールが受け渡された回数を返すメソッドを作成せよ。

私の解答はこちら。

public class ThrowTheBall {

 public int timesThrown(int N, int M, int L) {
  int[] nReceive = new int[N]; // 個人が受け取った回数を記録
  int nThrow = 0; // 全体でボールが投げられた回数を記録
  int pos = 0; // ボールの位置
  nReceive[0] = 1;
  while( true ){
   if( maxRecieve(nReceive) == M ) break; // 誰かがM回受け取ったら終了
   nThrow++;
   // 受け取った回数に応じて自分の左右のどちらに渡すか決める
   if( nReceive[pos] % 2 == 0 ){
    pos = ( pos + N - L ) % N;
   }else{
    pos = ( pos + L ) % N;
   }
   nReceive[pos]++;
  }
  return nThrow;
 }
 int maxRecieve(int[] array){ // 受け取った回数の最大値を求める
  int max = -1;
  for( int i=0 ; i<array.length ; i++ ){
   max = Math.max(max, array[i]);
  }
  return max;
 }

}

得点は190.25/250、中央値は約192点。1回のsubmitでシステムテストクリア。ちょっとした処理でも意味を持たせてみると見通しが良くなりますね。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計