2011年9月28日水曜日

TopCoder SRM254 Div2 250Pts

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計