校招真题讲解:抽奖

2023/07/27 leetcode 算法 共 1114 字,约 4 分钟

腾讯2021年秋招技术岗真题,原题如下:

抽奖

小A在玩一个网络游戏。这个游戏有个抽装备环节。装备池总共有n+m件装备,分别为n件普通装备和m件ssr装备。抽一次装备的费用按你抽中的装备决定。

抽中每一件装备的概率都为1/(n+m)。如果你抽中了ssr装备。这次的抽装备费用为2金币,否则这次的费用为1金币。如果你抽中了ssr装备,得到奖励,并且装备不会放回。如果你抽中了普通装备。得到奖励,但是这件装备会放回装备池。现在小A希望抽中所有的ssr装备,请你计算一下:需要花费金币的期望值。

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

输入描述:

输入一行:n,m(1<=n,m<=106)

输出描述:

抽中所有的ssr装备,需要花费金币的期望值。输出保留2位有效小数。

示例1

输入例子:

2 1

输出例子:

4.00

示例2

输入例子:

2 2

输出例子:

7.00

示例3

输入例子:

5 6

输出例子:

24.25

其实这是一个变形的几何分布,如果按照最直接的想法计算期望,即算出第m次,第(m+1)次……对应的概率乘以对应金币数,有几个问题:首先是次数是无穷的,这个问题可以用限制两位小数的精度来终止循环;第二是概率的计算问题,因为普通物品放回,ssr不放回,这样不同的顺序会导致抽出两者的概率不同,计算起来很繁琐。所以我们要换一个角度来看待这个问题。

我们知道最终我们一定会抽出m张ssr,那么我们只要计算每次抽出这一张ssr需要的金币期望相加就好了。这样做:1. 计算的循环是有限的;2. 从第i次抽到ssr到第(i+1)次抽到ssr的过程的概率分布是标准的几何分布,其中$p=\frac{(m-i)}{(m+n-i)}$,由此可知对应的期望是$\frac{(m+n-i)}{(m-i)}$。需要注意的是,这个期望是建立在金币都是1的情况下,由于第(i+1)次肯定抽到ssr,而ssr值2个金币,所以期望还要再加1。

几何分布的概率密度公式如下:

\[P(X=k)=(1-p)^{(k-1)}p,\quad k=1,2,3,...\]

几何分布的期望计算用错位相减,简单来说就是用$pE(X=k)-E(X=k)$,结果应为$\frac{1}{p}$。

由上面的分析,代码如下:

#include <iostream>
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    double ans=0.0;
    for(int i=0;i<m;++i){
        ans+=(double)(m+n-i)/(double)(m-i)+1;
    }
    printf("%.2f\n", ans);
}

文档信息

Search

    Table of Contents