1. 程式人生 > >H - 卡牌遊戲(簡單期望)

H - 卡牌遊戲(簡單期望)

Description

小貝喜歡玩卡牌遊戲。某個遊戲體系中共有N種卡牌,其中M種是稀有的。小貝每次和電腦對決獲勝之後都會有一個抽卡機會,這時系統會隨機從N種卡中選擇一張給小貝。普通卡可能多次出現,而稀有卡牌不會被重複抽到。小貝希望收集到K種稀有卡牌,她想知道期望需要多少次獲勝才能實現這個目標。

輸入描述:

資料有多組,第一行一個整數T表示資料組數。
每組資料一行,三個整數N,M,K .

輸出描述:

對於每組資料,輸出形如"Case #x: y",其中 x 為這組資料的編號(從1開始),y 為這組資料的答案。答案的絕對誤差或相對誤差在10^{-6}以內都認為是正確的。

備註

1 ≤ T ≤ 100
1 ≤ N ≤ 105
1 ≤ M ≤ N
1 ≤ K ≤ M

Sample Input

2
5 2 1
40 9 5

Sample Ouput

Case #1: 2.5
Case #2: 28.1146825397

Source::傳送門

題解 

題意:N種牌,M種稀有,每抽一次,會隨機從N種牌中抽取一張,但M種稀有牌不會重複抽到。現在想得到K種稀有卡牌,問抽牌的次數期望是多少。

第一次做期望題目,有點迷。關鍵解題就是得推公式了!

推導過程:

1.當k = 1 時:第一次抽到概率\frac{M}{N}

                       第二次抽到概率為\frac{(N-M)}{N}

\frac{M}{N}

                        ....

                        第n次的抽到的概率為\left ( \tfrac{N-M}{N} \right )^{n-1}*\tfrac{M}{N}

     期望 E= 1*\frac{M}{N} + 2 *  \frac{(N-M)}{N}\frac{M}{N}\left ( \tfrac{N-M}{N} \right )^{n-1}*\tfrac{M}{N}\frac{1-\left (\tfrac{N-M}{N}\right )^{n}}{1-\left (\tfrac{N-M}{N}\right )}  - n * \left (\tfrac{N-M}{N}\right) ^{n}(錯位相減求和)

     當n \to +\infty

時, 由單調性等可判斷出 E= \tfrac{N}{M}

2.當k = 2時,因為M種稀有牌不會重複得到,所以可以分解為兩個子問題,即可理解為先從N種牌,M種稀有種得到一個,再從N-1種牌,M-1種稀有種得到1種。所以E = \tfrac{N}{M}\frac{N-1}{M-1}.

3.依次類推 E = \sum_{i = 0}^{K-1}\tfrac{N-i}{M-i}

AC Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = (int)1e5+10;
const int INF = 0x3f3f3f3f;

int main()
{
    int T, n, m ,k, id = 0;
    cin>> T;
    while(T--)
    {
        id++;
        cin>> n >> m >> k;
        double ans = 0;
        for(int i=1; i<=k; i++)
        {
            ans += 1.0 * n / m;
            n--; m--;
        }
        printf("Case #%d: %lf\n",id,ans);
    }
    return 0;
}