今日の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 件のコメント:
コメントを投稿