• 牛客国庆集训 纸牌游戏 [概率]


    一、题意

    某个游戏体系中共有N种卡牌,其中M种是稀有的。小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝。普通卡可能多次出现,而稀有卡牌不会被重复抽到。小贝希望收集到K种稀有卡牌,她想知道期望需要多少次获胜才能实现这个目标。

    二、分析

    2.1前置知识

    独立重复试验的数学期望一个例子:一次射箭射中的概率为p,连续射击直到射中,射箭次数X的概率分布为[Pleft( {X = k} ight) = {left( {1 - p} ight)^{k - 1}}p]

    可以求得其数学期望为[Eleft( X ight) = sumlimits_{k = 1}^infty  {k{{left( {1 - p} ight)}^{k - 1}}p = psumlimits_{k = 1}^infty  {k{{left( {1 - p} ight)}^k} = frac{1}{p}} } ]

    2.2本题思路

    原题意叙述的不清楚,应该是一共N张卡牌,其中M张为稀有卡;对卡牌做如下操作:不断在牌堆中取牌,取到普通牌后放回,取到稀有牌后不放回,直到取到K张稀有牌为止,求完成这一目标的期望操作数。

    由于取出普通牌会放回,所以取出普通牌后不会改变在剩余牌堆中取出稀有牌的概率;所以将事件"在牌堆中取出K张稀有牌"表示为事件X,事件${x_i}$表示"共N-i张牌,其中M-i张稀有牌的牌堆中取到一张稀有牌",根据前置知识的分析,一次事件${x_i}$就对应一次射箭的场景;

    那么事件X可以表示为$X = sumlimits_{i = 0}^{k - 1} {{x_i}}$,根据期望的可加性有$ans = sumlimits_{i = 0}^{k - 1} {frac{{N - i}}{{M - i}}}$

    三、代码

     1 # include <iostream>
     2 # include <cstdio>
     3 using namespace std;
     4 int T,N,M,K;
     5 void Init()
     6 {
     7     scanf("%d%d%d",&N,&M,&K);
     8 }
     9 double Solve()
    10 {
    11     double res = 0;
    12     for(int i=0;i<K;i++)
    13         res+=((double)(N-i))/((double)(M-i));
    14     return res;
    15 }
    16 int main()
    17 {
    18     scanf("%d",&T);
    19     for(int i=1;i<=T;i++)
    20     {
    21         Init();
    22         double ans = Solve();
    23         printf("Case #%d: %f
    ",i,ans);
    24     }
    25     return 0;
    26 }
  • 相关阅读:
    win32: 静态控件(Static)
    malloc() 和 calloc()有啥区别
    win32: WM_PAINT 实现双缓冲缓图
    char 与 unsigned char的本质区别
    iconv: iconv_open(pToCharset, pFromCharset); 的附加参数//IGNORE
    c语言: 生成随机数
    深圳市住房公积金管理中心
    利用latex制作个人简历
    分布式系统概念与设计中文版(第三版)
    数据结构-红黑树
  • 原文地址:https://www.cnblogs.com/cnXuYang/p/9744050.html
Copyright © 2020-2023  润新知