专栏文章

题解:P13800 [SWERC 2023] Throwing dice

P13800题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio6xzlf
此快照首次捕获于
2025/12/02 14:22
3 个月前
此快照最后确认于
2025/12/02 14:22
3 个月前
查看原文

闲聊

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

期望值

期望值:在一个离散性随机变量试验中每次可能结果的概率乘以其结果的总和。
换句话说,期望值是随机试验在同样的机会下重复多次的结果计算出的等同“期望”的平均值。
还是不懂?我也不懂!举个例子。
例如,A 与 B 游戏,A 有 2/32/3 的概率获胜,B 只有 1/31/3 的概率获胜;但是每次 A 获胜从 B 那里得到 11 元,每次 B 获胜从 A 那里得到 33 元。
虽然 A 更有概率获胜,但 A 每次游戏赚到的钱的期望值是 23×1+13×(3)=13\frac{2}{3}\times1+\frac{1}{3}\times(-3)=-\frac{1}{3},即平均每次游戏少 13\frac{1}{3} 元。
期望值可以帮助我们反应整体的随机情况,也可以应用到本题中。

应用

  • 如果 Alice 的所有骰子的点数的期望值更大,那么 Alice 获胜概率更大;
  • 反之,如果 Bob 更大,那么 Bob 获胜概率更大;
  • 最后,如果他们所有骰子的期望值相等,那么概率相等。

细节

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

代码

CPP
#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";
    
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...