2012年4月7日土曜日

TopCoder SRM365 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題についておおまかに説明する。

チェスの大会で、全員が一度ずつペアになって対戦する。試合の結果は3つの中のどれかになる。プレーヤ1の勝利、プレーヤ2の勝利、引き分けである。トーナメントのあいまいさを表す数字は3すくみの関係が成立する3人のペアの数になる。つまり、aはbに勝利し、bはcに勝利し、cはaに勝利するということである。table[]という試合結果が入った文字列型配列が渡される。table[i]のj番目の要素について、iがjに勝てば"1"、負ければ"0"、引き分けなら"-"が含まれることになる。与えられたトーナメントのあいまいさを表す数字を返せ。

私の解答はこちら。

public class TournamentsAmbiguityNumber {

 public int scrutinizeTable(String[] table) {
  int nAmbiguity = 0;
  int nMember = table[0].length();
  for( int i=0 ; i<nMember ; i++ ){
   for( int j=0 ; j<nMember ; j++ ){
    for( int k=0 ; k<nMember ; k++ ){
     if( i==j || j==k || k==i ) continue; // 3人の関係を見ていない場合
     char a = table[i].charAt(j);
     char b = table[j].charAt(k);
     char c = table[k].charAt(i);
     // よくよく考えてみると a == '1' && b == '1' && c == '1'
     // とすればよいだけだった。そうすればreturn文で2で割ることも不要になる。
     if( a == '-' || b == '-' || c == '-' ) continue;
     if( a == b && b == c ){
      nAmbiguity++;
     }
    }
   }
  }
  return nAmbiguity/2; // 全部0,0,0と1,1,1の場合がカウントされているので2で割る
 }

}

得点は227.60/250、1回のsumbitでシステムテストクリア。無駄にコードが増えてますな。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計