ソウルアーティスト
タイトル説明
私は理由を知りませんが、いつも不思議な方法で絵を終了したいです。
あなたは舗装さ画用紙のn枚の行を入れて、そこからnは1の数。あなたのC色の合計これらの色をすることができ、利用可能なC-1から0までの番号が付けられています。最初は、すべての色が紙描画されている1。ペイントするk回の合計、塗料ときにi番目、あなたがランダムに閉区間[Lから選択たい確率Iは、R I(空であってもよい)紙面のサブセット内]、その後ランダムに色を選択B I、および画用紙の色を選ぶためには、コーティングされています。画用紙塗装色bの後に元の色は、色が(* b)はモッズCになり、これは、この世界の法則です。
名前付きデジタルカラーを使用しますので、あなたがデジタルと期待値の和に対応する各色の画用紙、k番目の絵の終わりに見つけることができます。今、あなたは、この値をプログラミングについて尋ねます。
念のためにあなたが期待されているのか分からない:P-あり数量X、場合1の値は、V確率1は、P-あり2確率値v 2 ...... p型N- Vの確率値のn、そしてXは、 Pに等しい期待値1 V 1 + P 2 V 2 + ... + P N- V N-
入力形式
最初の行は、タイトルを意味するものとして、3つの正の整数n、C、Kを含有します。
次のk行、二つの数Lを含む各列Iは、R Iあなたがランダムにどのセクションから用紙を描画する各操作から選択されることを、。
出力フォーマット
ライン、小数は最も近い小数点以下を四捨五入3つの答えを表します。
サンプル入力1
2 3 1 1 2
サンプル出力1
2.000
サンプルの解釈
、それぞれの確率は1/4であるのサブセットを選択するための4つの可能性があります。
紙は変化せず、色は、1 + 1 = 2である:空集合から選択されます
用紙2は変化しない:{1}から選択されます。そこに、それぞれ最終カラー0,1,2に画用紙は、確率は1/3となるように可能な三つの色を選択することで、所望の色は1/3 *(1 + 0)+ 1/3 *(1 +1)+ 1/3 *(2 + 1)= 2。
選択される:{2}対称と1から選択され、所望の色が2です。
{1,2}から選択される2つの色が、最終的に0,1,2紙になるように、三つの可能なから選択された色、確率は1/3であり、所望の色が1/3 *(0 + 0であります)+ 1/3 *(1 + 1)+ 1/3 *(2 + 2)= 2。
要約すると、配色とサブセット選択の4種類の望ましく2です。
サンプル入力2
3 3 3 1 2 2 3 1 3
サンプル出力2
2.639
データ範囲:
アイデア:
そして、期待と希望=。各シートの初期状態が1であるので、そうN考える。3 DP望ましいです。私たちは[i] [j]は一枚の紙を表しDPた後、私は、色jの確率になったら、それは操作されました。各シートは、いくつかの統計的な操作のために別々に計算。選択された各色の確率が1 / Cである確率のそれぞれ列挙サブセットであれば、我々は、遷移式を有する、間隔選択された色の各要素の半分を有しますそれを選択した:DP [T] [I *は Jの%Cを] + = DP [T-1] [I] /(C * 2)、 選択されるべきではない場合:DP [T] [I] + = DP [ T-1] [I] / 2。
コード:
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> 使用して名前空間はstdを、int型 N、C、K、A、B、NUM [ 108 ]、MAXN。 二重 DP [ 108 ] [ 108 ]、ANS。長い長い)(読み取り { 長い長 X = 0、F = 1 。 チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH- ' 0 ' ; CH = GETCHAR();} 戻りのx *のF。 } int型のmain() { freopenは(" paint.in "、" R " 、STDIN)。 freopenは(" paint.out "、" W " 、STDOUT)。 N = read()は、C =読み取る(); Kは、= )(読み取ります。 (int型 i = 1 ; iは= K <; ++ I) { A =リード(); B = 読み取ります()。 以下のために(int型 iは=; iは= bを<; ++ I) { NUM [I] ++ ; MAXN = MAX(MAXN、NUM [I])。 } } DP [ 0 ] [ 1 ] = 1 。 用(int型、T = 1 ; tは<= MAXN; ++ T) { ため(int型 i = 0 ; iはCを<; ++ I) { 以下のために(int型 J = 0 ; J <C; ++ J) { DP [T] [Iが J *の%のC] + = DP [T- 1 ] [I] /(C * 2 )。 } DP [T] [I] + = DP [T- 1 ] [I] / 2 。 } } のための(int型 i = 1 ; iが<= N ++ I) { ため(INT J = 0 ; J <C; ++ J) { ANS + = DP [NUM [I]、[J] * J ; } } のprintf(" %の.3lf " 、ANS)。 リターン 0 ; }