【クラップ] Tyvj2046

質問良い水

クラップスの
説明

      偶然虹とフリーダチャンスが悪魔に来ました。言葉ベアリングドアの上の悪魔:
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 ; 
}

 

おすすめ

転載: www.cnblogs.com/tonyshen/p/11372373.html