質問良い水
クラップスの
説明
偶然虹とフリーダチャンスが悪魔に来ました。言葉ベアリングドアの上の悪魔:
Xiaopenの友人は、悪魔〜へようこそ!ああ〜ララを入力するために、このような問題を解決する必要が
サイコロのN個が存在する前記最初のi(1 <= iが= < N) ダイス片[i]は平面を有しています。場合、i番目の投ダイス、その上向き[i]は、表面のみ、および[i]はそれぞれに対向等しい面である確率1 /ような[I]。
ドアはまた書い:Nダイス、M =シグマ([I]の明らか合計 ) 番目の面。あなたは再びMの表面に書かれて漏れないM 1〜M番号を入れて行う必要があります。同時にN個のサイコロ投げでは、あなたのスコアは、N個のサイコロの数側の合計であり、上向きに。あなたがする必要があることは、あなたのスコアの最大値が期待値ああを作ることです〜
入力の形式
整数N、ダイスの数の最初の行。
N個の整数の2行目、第整数I [i]はダイスのi番目の面の番号を示しています。
出力形式の
実数アンスのライン、フリーダと表明期待値最大化虹のスコアは、小数点以下3桁に四捨五入。
入力サンプル
2
。1 4
サンプル出力
7.500
ヒント
サンプルは、説明
サイコロ辺が1,2,3,4である第2の書き込みを書き込むために、ダイ5の第1の側面にユニーク。このように+(1 + 2 + 4 + 3)5/1を獲得することが望ましい/4=7.5。
これは、データ範囲と一致した
データの30%を、N <= 10
データの50%、N <= 1000
データの100%、0 <N <= 50000、 0 <I <= 100。
ソリューション:
貪欲、小さな拡大表面の数、プラス評価演算シーケンスを考え
証明:こんにゃく、私は許可しません。
さらに騒ぎがなければ、コード上:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INTの N、M、[ 50010 ]。 ダブル S [ 5001000 ]。 INT メイン(){ freopenは(" dice.in "、" R " 、STDIN)。 freopenは(" dice.out "、" W " 、STDOUT)。 scanf関数(" %のD "、&N) 用(int型 i = 1 ; iが<= N iが++ ){ scanf関数(""& [I]); M + = [I]; } ため(int型 I = 1 ; I <= M; iは++)S [I] = sの[I- 1 ] + I; ソート(A + 1、A + N + 1 ); 二重 ANS = 0.0 ; INT最後=のmは、 のために(int型 I = 1を iが<= N; iが++ ){ ANS + =(ダブル)((S [最終] [最後-A -s [I]])/(ダブル)[I]); 最後 - = [I]; } printf(" %の.3lf " 、ANS)。 リターン 0 ; }