このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
conflicts[]という文字列型配列が与えられる。配列の各要素は多人数が参加するゲームの1人のプレーヤーを表している。i番目の要素がプレーヤーiを表し、プレーヤーiを表す配列のj番目の要素はiがjに対し、勝つのであれば'W'、同点なら'T'、負けなら'L'という文字になる。やるべきことは、各プレーヤーが他のプレーヤーに対し、少なくともp%勝ち、q%負けるということを保証することである。もしこれらの要求が満たされないプレーヤーがいれば、0を始点としたインデックスでプレーヤーを表したときに、初めて現れる要求を満たさないプレーヤーのインデックスを返し、全員が要求を満たすのであれば、-1を返す。もし全体でN人いるようであれば、少なくともWはceil((N-1)*p/100)(小数点以下切り上げを行った整数のこと)の割合でプレーヤーiを表す配列の要素中に'W'という文字が現れることになる。負けを表す式も同様である。
また、配列全体の要素を数えるとWとLは同数である。また、プレーヤーiのi番目の要素は常にTである(自分自身と戦うわけではない)。
私の解答はこちら。
public class BalancedGame { public int result(String[] conflicts, int p, int q) { int nPlayer = conflicts.length; for( int i=0 ; i<nPlayer ; i++ ){ int nW = 0; int nL = 0; for( int j=0 ; j<conflicts[i].length() ; j++ ){ if( conflicts[i].charAt(j) == 'W' ){ nW++; }else if( conflicts[i].charAt(j) == 'L' ){ nL++; } } if( (double)nW/(nPlayer-1) < p/100.0 || (double)nL/(nPlayer-1) < q/100.0 ) return i; } return -1; } }
先頭のプレーヤーから順番にWとLを数えて、条件を満たさないプレーヤーのインデックスを返せばよい。割り算はnPlayer-1であることに注意がいる。当初nPlayerで割っていたので、1回システムテストで落とされてしまった。
0 件のコメント:
コメントを投稿