1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ゲーム・確率DPメニュー(言語選択)
  4. 問題一覧 VB(Beta)編
  5. (問題 9) サイコロ step.2 VB(Beta)編

ゲーム・確率DPメニューのサムネイル
(問題 9) サイコロ step.2 VB(Beta)編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

各面の出る確率が等しい N 面のダイスがあり、このダイスを最大で 2 回まで振ることができます。最終的な出目が i のとき、スコアは c_i になります。スコアの期待値を最大化するような戦略を取ったときの期待値を求めてください。

この問題について、例として一般的なサイコロを考えます。つまり、6 面サイコロでスコアは出目と同じである状況を考えます。

サイコロを 1 回までしか振ることが出来ない場合、戦略は 1 回振る戦略しかなく、スコアの期待値はすべての面に対して出る確率は 1/6 なので、(1 + 2 + 3 + 4 + 5 + 6) / 6 = 3.5 となります。

では、問題と同様に 2 回まで振れることを考えます。そのとき、戦略は 1 回でやめるか、2 回振るかのどちらかになります。

1 回目の出目が C であったときを考えます。このとき、ここでやめれば、スコアが C である確率は 100 %なので最終的なスコアの期待値は C になります。もう一回振った場合は、先ほど考えた 1 回までしか振ることが出来ない状態と同じ状態になり、期待値は 3.5 になります。



期待値は (1 回目で C が出たときの最終的なスコアの期待値) × 1/6 を C が 1 から 6 のときの総和をとったものになるので、この期待値を最大化するには、C ≧ 3.5 ならば振るのをやめ、C < 3.5 ならば、もう一回振る戦略をとることが良いことがわかります。

他の状況に関しても同様に考えることが出来ます。では、実際にやってみましょう。

問題

各面の出る確率が等しい N 面のダイスがあり、このダイスを最大で 2 回まで振ることができます。

最終的な出目が i (1 ≦ i ≦ N) のとき、スコアは C_i になります。スコアの期待値を最大化するような戦略を取ったときの期待値を求めてください。

入力される値

入力は以下のフォーマットで与えられます。


N
C_1
C_2
...
C_N


1 行目には 1 つの整数 N が与えられます
i + 1 (1 ≦ i ≦ N) 行目には 1 つの整数 C_i が与えられます。
入力は合計で 1 + N 行からなり、入力値最終行の末尾に改行が 1 つ入ります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

期待値を 1 行で出力してください。

相対誤差もしくは絶対誤差が 10 ^ -4 以下のとき正解と判定されます。

条件

すべてのテストケースにおいて、以下の条件をみたします。


  • 2 ≦ N ≦ 100

  • 0 ≦ C_i ≦ 100000 (1 ≦ i ≦ N)

入力例1

6
1
2
3
4
5
6

出力例1

4.25000000000000000000

入力例2

7
7
7
7
7
7
7
7

出力例2

7.0000000000

問題一覧へ戻る

ページの先頭へ戻る