2013年2月23日土曜日

TopCoder SRM462 Div2 250Pts

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

アーチェリーでは、矢を標的に放ち標的の当たった位置によって得点を得る。この問題では、標的はN個の輪と中央の円からなるものとする。輪の幅と中央の円の半径は等しいとする。各目標の位置に割り当てられた得点は整数型の配列ringPoints[]で与えられる。得点は内側から外側へ順に与えられており、添字0は中央の円、添字Nは一番外側の輪の得点である。あなたはアーチェリーを始める。矢を放つたびに標的のランダムな場所に当たり、どの位置にあたる確率も等しいものとする。矢を放ったときの得点の期待値を返せ。

私の解答はこちら。

public class Archery {

 public double expectedPoints(int N, int[] ringPoints) {
  int total = 0;
  for( int i=0 ; i<ringPoints.length ; i++ ){
   // 各位置に当たる割合は内側から順に1, 3, 5, ..., 2N+1となる
   total += ringPoints[i]*(2*i+1); 
  }
  return total*1.0/((N+1)*(N+1)); // 1+3+...+(2N+1)=(N+1)^2で割って正規化
 }

}

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

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計