洛谷题单指南-概率与统计-P2719 搞笑世界杯

原题链接:https://www.luogu.com.cn/problem/P2719

题意解读:有2n张票,A类票和B类票各n张,当A类票和B类票都没有卖完时,下一张票是A或B的概率为50%,如果某一类票卖完,下一张票的概率为1,求最后两张票相同的概率。

解题思路:

1、方法一

要直接求最后两张票相同的的事件的概率不太容易,可以转为求最后两张票不同的事件概率,这样的事件意味着前2n-1张票都要通过抛硬币决定,也就是一个事件的概率为1/22n-1,一共有多少个这样的事件?也就是前2n-2张票选n-1为A,其余为B,最后两张票有AB、BA 2种可能,一共有2*C(2n-2,n-1)个。

因此,最后两张票不同的总概率为2*C(2n-2,n-1)*1/22n-1 = C(2n-2,n-1)/22n-2

最后两张票相同的概率为1 - C(2n-2,n-1)/22n-2 = 1 - ((2n-2)/4(n-1)) * ((2n-3)/4(n-2))...(n/4)

100分代码:

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

int n;

int main()
{
    int x;
    cin >> x;
    n = x / 2;
    double ans = 1;
    for(int i = 1; i <= n - 1; i++)
    {
        ans *= 1.0 * (2 * n - 1 - i) / (n - i) / 4;
    }
    ans = 1 - ans;
    printf("%.4f", ans);
    return 0;
}

2、方法二

采用动态规划的方法,我们发现当剩余i张A票,j张B票时,最后两张票一样的概率,跟卖出一张票之后,剩下的票中最后两张票一样的概率相关

设f[i][j]表示剩下i张A票j张B票时最后两张票一样的概率

下一张卖出A的概率是0.5,卖出B的概率也是0.5

因此有状态转移:f[i][j] = (f[i-1][j] + f[i][j-1]) / 2

初始化:f[i][0]=f[0][j]=1, i,j>=2,显然一种票卖完,剩下最后两张票一样的概率是100%

100分代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1500;
double f[N][N];
int n;

int main()
{
    int x;
    cin >> x;
    n = x / 2;
    for(int i = 2; i <= n; i++) f[i][0] = f[0][i] = 1;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            f[i][j] = (f[i - 1][j] + f[i][j - 1]) / 2;
    printf("%.4f", f[n][n]);
    return 0;
}

 

posted @ 2025-12-31 10:43  hackerchef  阅读(8)  评论(0)    收藏  举报