Archery

archery.png

問題

あなたは弓の射手です。
N重の輪のターゲットがあります。
一番内側の円の半径がrとすると、それ以降の外側の輪っかの太さもrです


int[] ringPoints の配列にどこに当てると何ポイント入るか書いてあります。
たとえば

int[] ringPoints={10, 0}

だったら、一番内側の円に入ると10点、それ以外だと0点です。

N=4で

int[] ringPoints={100, 0, 100, 0, 100}

だったら

一番内側の円の面積は$r^2\pi$です
その外側のドーナツの面積は

(1)
\begin{align} (2r)^2\pi-r^2\pi = (4r^2-r^2)\pi = 3r^2\pi \end{align}

さらにその外側は

(2)
\begin{align} (3r)^2\pi-(2r)^2\pi = (9r^2-4r^2)\pi = 5r^2\pi \end{align}

おや、どうやら面積比は奇数になりそうです。


そのターゲットに当たる確率は、

(3)
\begin{align} そのターゲットに当たる確率=\frac{ターゲットの面積}{全部の面積} \end{align}

ですね。
全部の面積は

(4)
\begin{align} ((N+1)r)^2\pi \end{align}

です。
なのでi番目のターゲットにあたる確率

(5)
\begin{align} i番目のターゲットにあたる確率=\frac{((i*2+1)r)^2\pi}{((N+1)r)^2\pi} \end{align}

$r^2$$\pi$は消せます
あとはこれに各i番目の点数を掛け算すれば期待値になります

ソースコード

public class Archery {
    public double expectedPoints(int N, int[] ringPoints){
        //面積の合計
        double sumArea=(N+1)*(N+1);
        double expected=0;
        for(int i=0;i<N+1;i++){
            double probability=(i*2+1)/sumArea;
            double ex=(double)ringPoints[i]*probability;
            expected+=ex;
        }
        return expected;
    }
}

source on git

サポートサイト Wikidot.com