H - 卡牌游戏(简单期望)

版权声明:Andy https://blog.csdn.net/Alibaba_lhl/article/details/83097934

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;
}

猜你喜欢

转载自blog.csdn.net/Alibaba_lhl/article/details/83097934
h'h