题解:P13800 [SWERC 2023] Throwing dice

· · 题解

闲聊

~~要是想预测 2022 年卡塔尔世界杯决赛阿根廷和法国的点球大战,应该怎么分配骰子啊?
别的不说,光门神大马丁的实力就能给阿根廷加个 6 点的骰子。~~

期望值

期望值:在一个离散性随机变量试验中每次可能结果的概率乘以其结果的总和。
换句话说,期望值是随机试验在同样的机会下重复多次的结果计算出的等同“期望”的平均值。

还是不懂?我也不懂!举个例子。
例如,A 与 B 游戏,A 有 2/3 的概率获胜,B 只有 1/3 的概率获胜;但是每次 A 获胜从 B 那里得到 1 元,每次 B 获胜从 A 那里得到 3 元。
虽然 A 更有概率获胜,但 A 每次游戏赚到的钱的期望值是 \frac{2}{3}\times1+\frac{1}{3}\times(-3)=-\frac{1}{3},即平均每次游戏少 \frac{1}{3} 元。

期望值可以帮助我们反应整体的随机情况,也可以应用到本题中。

应用

细节

需要注意的是,虽然无论怎么掷骰子都不会得到小数,但是期望值可能是小数(比如 1\sim6 的公平骰子的点数期望值是 3.5)。
所以判断相等时最好不要直接写 ==,而是另写一个判断误差不超过某个特定值即为相等的函数。

代码

#include<bits/stdc++.h>
using namespace std;

// 判断相等 
bool equal(double x, double y){
    return fabs(x-y) <= 1e-4;
}

int main(){
    int n, m; cin >> n >> m;
    // 计算期望值  
    double pa = 0, pb = 0;
    while(n--){
        int x; cin >> x;
        pa += (x + 1) / 2.0;
    }
    while(m--){
        int y; cin >> y;
        pb += (y + 1) / 2.0;
    }

    // 分情况 
    if(equal(pa, pb)) cout << "TIED";
    else if(pa > pb) cout << "ALICE";
    else cout << "BOB";

}