2012年12月14日金曜日

TopCoder SRM443 Div2 250Pts

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

サッカーでは、すべてのメジャーな国別リーグは次の方法で実施されている:

リーグはいくつかのチームからなる。1年を通して、各チームは別のチームと2試合行う - 1つは自身のスタジアム、1つは相手のスタジアムで行う。チームが自身のスタジアムでプレーするときは"ホームチーム"、相手は"アウェーチーム"と呼ばれる。各試合は3つの結果の1つで終わる: ホームチームの勝利、引き分け、相手チームの勝利である。チームは勝つ度に3ポイントを獲得する。引き分けは両方のチームに1ポイントが与えられる。負けたチームにはポイントは与えられない。全チームのランキングは各チームが受け取ったポイントの合計に基づく。さて、matches[]という文字列型の配列が与えられる。i番目の要素のj番目の文字の試合はチームiのスタジアムでチームiとチームjの間の試合の結果を表す。Wはホームチームの勝利、Dは引き分け、Lはアウェーチームの勝利を表す。主対角線上の試合のすべての文字は自身と戦うことはないので、"-"になる。i番目の要素がi番目のチームが獲得した点数の合計となる整数型の配列を返せ。

私の解答はこちら。

public class SoccerLeagues {

 public int[] points(String[] matches) {
  int[] pts = new int[matches.length];
  for( int i=0 ; i<matches.length ; i++ ){
   for( int j=0 ; j<matches[0].length() ; j++ ){ // 全探索の必要がある
    if( i == j ) continue; // 対角線上は無視
    char c = matches[i].charAt(j);
    if( c == 'W' ){ // cの結果に応じてチームi、jにポイントを振り分ける
     pts[i] += 3;
    }else if( c == 'D'){
     pts[i]++;
     pts[j]++;
    }else{
     pts[j] += 3;
    }
   }
  }
  return pts;
 }

}

得点は241.19/250、1回のsubmitでシステムテストクリア。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計