抽卡游戏~2021.1.12

题目描述

本题的灵感来源于一个古典的概率模型。
Alice 在一个卡池里抽卡,里面有 x 张 s 卡和 y 张 a 卡。
Alice 每次会不放回的随机从卡池中抽出一张卡。
Bob 在一旁看 Alice 抽卡并对每次的结果进行预测:
若卡池里 s 卡的数量多于 a 卡,Bob 会猜 Alice 抽出 s 卡。
反之则会猜测 Alice 抽出 a 卡。
但是如果当卡池里的两种卡的数量相等的时候,Bob 就不对抽卡的结果做任何的猜测了。
Alice 会一直抽卡,直到卡池空为止。
现在告诉你初始的时候卡池里 s 卡和 a 卡的数量,你能算算 Bob 期望下猜对多少次?

输入格式

在一行中给出两个整数 a,b(1≤a,b≤105)

输出格式

一个实数表示期望,四舍五入保存两位小数。

输入样例

1 1

输出样例

1.00

样例解释

初始局面的时候 Bob 不做任何猜测,第一次抽完之后,第二次抽的时候不管剩下的是哪一种卡,Bob 都能猜对,所以期望是1.00。

AC代码

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    
    
    int a,b;
    cin>>a>>b;
    cout<<fixed<<setprecision(2)<<float(max(a,b));
    return 0;
}

解释

①在PTA中一道30分的题,代码却看起来短小精悍,且十分简单,仅按体重条件输出输入数据中的最大值即可,但其背后的数学原理有些复杂。
②数学原理:实际上就是古典概率模型的应用。
令E(a,b)表示题中所叙述的数学期望。
故,E(1,1) = 1,E(2,2) = 2/2 * E(2,1) = 2/2 * (2/3 + 2/3 * E(1,1) + 1/3 * E(2,0)),经归纳,得到普遍公式:E(a,b) = a/(a+b) + a/(a+b) * E(a-1,b) + b/(a+b) * E(a,b-1) (a>b时,故必然有E(a-1,b) = a-1,E(a,b-1) = a),化简得E(a,b) = a * (a+b)/(a+b) = a。(a = b,a < b 时的证明方法与上述相同,不再赘述)

  • 如何理解E(a,b) = a/(a+b) + a/(a+b) * E(a-1,b) + b/(a+b) * E(a,b-1)
    如上述,E(a,b)表示在a卡,b卡分别有a张和b张时,直到所有卡全部被抽完,Bob抽卡的猜对次数。a/(a+b)表示Bob预测Alice抽卡的概率(Bod预测的是抽多卡,且E(a,b) = a/(a+b) + a/(a+b) * E(a-1,b) + b/(a+b) * E(a,b-1)的前提条件是假设a>b),a/(a+b) * E(a-1,b) + b/(a+b) * E(a,b-1)指的是真实的抽卡概率,抽多卡的概率为a/(a+b) * E(a-1,b),抽少卡的概率为b/(a+b) * E(a,b-1)

③因此,只要按条件输出a和b的大者,即是答案。

猜你喜欢

转载自blog.csdn.net/fatfairyyy/article/details/112515212
今日推荐