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