洛谷题单指南-概率与统计-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;
}
浙公网安备 33010602011771号