首页 > 试题广场 >

硬核抽奖

[编程题]硬核抽奖
  • 热度指数:83 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

智加年会惯例的抽奖环节,获得一等奖抽奖资格的同事需要面对一个挑战:主持人会在三个盲盒中的某一个里面放上奖品,然后请抽奖同事指定其中一个盒子。
主持人知道奖品在哪个盒子里,因此,无论抽奖同事选择的盒子中有没有奖品,主持人会从剩下两个盒子里面打开其中一个没有奖品的盒子。这时,除去抽奖者选择的盒子,
主持人打开的没有奖品的盒子,场上还剩下一个盒子。这时候主持人会询问抽奖同事:“我为你排除了一个没有奖品的盒子,你现在要改变选择、选最后剩下的那一个吗?”
抽奖者确定改选或者不改选后,主持人就会打开抽奖者最终选中的盒子,并恭喜中奖(或遗憾宣布与奖品失之交臂)

  • 抽奖者为最大化中奖概率,他应该改选还是不改选,为什么?
  • 我们将上一问题推广,现有 k 个一等奖奖品,放在 m 个盒子中。在抽奖者完成第一次选择后,主持人会在剩下的 m-1 个盒子中,打开 n 个空盒,并且
    询问候选人,是否要改选为剩余的 m-1-n 中的某一个,试给出抽奖者改选以及不改选的中奖概率公式,并证明 对于任意 k,m,n (0<k<m-1-n, m>=3, n>=1)
    存在两种策略的中奖概率一种恒大于另一种
  • 【本题编程】试用编程模拟上一问题
示例1

输入

3,1,1,true

输出

0.6666666666666666

数学

就是三门问题的变种,本质是一道数学题,因此代码异常简单,难度在于其数学推导。
(1) 更换箱子:
i) 如果当前我选中的箱子是无奖的,那么更换箱子的中奖概率为,即第一次选择无奖的概率*换箱子中奖的概率;
ii) 如果当前我选中的箱子有奖,那么更换箱子的中奖概率为,即第一次选择有奖*换箱子之后仍然中奖的概率。
两者之和为,但是时不存在后者,因此只有前者的情况。
(2) 不换箱子:在这种情况下,后面打开个空箱等一系列迷惑操作可以无视,因此中奖概率恒定为

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * the winning expectation given the m,n,k settings and change strategy
     * @param m int整型 the number of boxes
     * @param n int整型 the number of the boxes that the host will exclude for the candidate
     * @param k int整型 the number of prizes
     * @param change bool布尔型 true if the candidate decides to change the selection
     * @return double浮点型
     */
    public double simulate (int m, int n, int k, boolean change) {
        // write code here
        return change? (k > 1? 1.0*k/(m - n - 1): 1.0*(m - k)*k/(m*(m - n - 1))): 1.0*k / m;
    }
}
编辑于 2022-04-08 15:46:31 回复(0)
这是一个典型的三门问题,可以通过枚举的方法获得概率,不妨试着枚举一下:
1. 对于不换的情况,显然之后主持人打不打开盒子都不会影响概率,所以概率恒定为 k/m;
2.对于换的情况,需要分类讨论:
    a. 原本是空的,换完之后中奖了,此时概率为 (m-k)/m * k/(m-n-1);
    b. 原本中奖了,换完之后还是中奖的(需要注意的是k>1才会出现这种情况),此时概率为 k/m * k/(m-n-1);
据此,可以得到最后的答案为:
double simulate(int m, int n, int k, bool change) {
        // write code here
        if(change)
        {
            if(k>1) return (double)k / (m-n-1);  //这是情况2中a和b概率之和
            return (double)k * (m-1) / m;
        }
        else return (double)k/m;
    }


发表于 2022-04-07 19:07:45 回复(0)

热门推荐

通过挑战的用户