読者です 読者をやめる 読者になる 読者になる

SRM 245 Div2 Med (Problem 600) Flush:日本語訳のようなもの

フラッシュ

eiya君はフラッシュというカードゲームをしています。このゲームは、手札の中の同じマークのカードの枚数の最大値が得点になります。例えば、手札にスペード5枚、ハート2枚、他0枚の場合、5点です。eiya君はこのゲームを有利に進めたいです。

 

eiya君は今手札を持っていません。今からデッキからnumber枚のカードを引きます。デッキのカードはマークで4種類に分けることができ、これらはそれぞれS0,S1,S2,S3枚です。このとき、number枚のカードを引き終わった後のeiya君の得点の期待値を求めてください。

 

補足:例えば、1/2の確率で得点が3に、残り1/2の確率で得点が2になるとき、期待値は(0.5*3)+(0.5*2)=2.5です。

クラス定義

  • クラス名:Flush
  • メゾット:size
  • 引数:vector<int> , int
  • 戻り値型:double
  • メゾット宣言:double size(vector<int> S, int number)
(メゾットは必ずpublicにしてください)

制限

  • 実行時間2.000
  • メモリ (MB)64

注意

  • 値は32bit整数に収まらない可能性があります。
  • 答えは絶対誤差or相対誤差で10^-9以下になるようにしてください。

制約

  • |S|==4.
  • 0<=Si<=13
  • 0<=number<=Sの合計

テストケース例

  1. input
    • S { 2, 2, 2, 2 }
    • number 2
    output
    Returns 1.1428571428571428
    note
    始めに一枚引きます。次に1/7の確率で始めに引いたカードと同じマークのカードを引きます。
    得点の期待値は (1/7 * 2) + (6/7 * 1) = 8/7 = 1.1428571428571428です。
  2. input
    • S { 1, 4, 7, 10 }
    • number 22
    output
    Returns 10.0
    note
    全てのカードを引くため、一番大きい枚数の10が答えになります。
  3. input
    • S { 13, 13, 13, 13 }
    • number 49
    output
    Returns 13.0
    note
    48枚引いた段階で、少なくとも一つが13枚になっているか、全て12枚かのどちらかです。そこからさらに一枚引くので、少なくとも一つは13枚になります。
  4. input
    • S { 13, 13, 13, 13 }
    • number 26
    output
    Returns 8.351195960938014
  5. input
    • S { 13, 13, 13, 13 }
    • number 0
    output
    Returns 0.0