2011年7月18日月曜日

TopCoder SRM204 Div2 250Pts

今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。

問題について説明する。Mediciというボードゲームがある。このゲームでは各プレーヤーはfame、fortune、secretsという3つのパラメータを稼ぎ、最終的に3つの最小値が最大になったプレーヤーが勝利するということになっている。fame、fortune、secretsの配列を引数に与える。配列のi番目はプレーヤーiを表すものとする。このとき、勝者の添え字を返すメソッドを作成せよ。但し、勝利するプレーヤーが複数存在する場合は、引き分け再試合ということで-1を返すようにせよ。

私の解答はこちら。

public class Medici {
 public int winner(int[] fame, int[] fortune, int[] secrets) {
  int min = -1;
  int idx = 0;
  int mins[] = new int[fame.length];
  for( int i=0 ; i<fame.length ; i++ ){
   int tmp = Math.min(fame[i], fortune[i]);
   tmp = Math.min(tmp,secrets[i]);
   mins[i] = tmp;
   if( min < tmp ){
    min = tmp;
    idx = i;
   }
  }
  int n = 0;
  for( int i=0 ; i<mins.length ; i++ ){
   if( min == mins[i] ) n++; // 既存の物に一致するとn>=1になる
  }
  if( n >= 2 ) return -1; // 2回以上全体の最小値が出現したら-1を返す
  return idx;
 }
}

得点は、241.81/250。正解率は約83.7%。もっと簡単に書いていたコードがあったので以下に紹介する。for文は一つで十分なのであった。

public class Medici {
 public int winner(int[] fame, int[] fortune, int[] secrets) {
  booleans tie = true;
  int max = -1;
  int best = -1;
  for( int i=0 ; i max ){
     max = min;
     best = i;
     tie = false;
    }else if( min == max ){ // 最小値が既存の数値に一致した場合
     tie = true;
    }
  }
  return tie == true ? -1 : best;
 }
}

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計