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