今日の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 ; imax ){ max = min; best = i; tie = false; }else if( min == max ){ // 最小値が既存の数値に一致した場合 tie = true; } } return tie == true ? -1 : best; } }
0 件のコメント:
コメントを投稿