uva557 - Burger(汉堡)

本文介绍了一种通过计算对立事件概率的方法来解决复杂问题的技巧。主要关注于如何在两种汉堡都有剩余的情况下,计算两个顾客获得相同汉堡的概率。文章还提供了一个递归公式用于计算该概率,并给出了具体的代码实现。

概率计算,,,

先计算它的对立事件的概率比较简单。就是最后两个分到的汉堡不一样。

那么最后两个肯定是两个不同的。

所以这种事件的总数有c(n-2,(n-2)/2)个,

开始的时候用总数为c(n,n/2)来计,发现连样例都过不了。。

后来用2^(2-n)来乘。得到的概率就行了。。

回过去。才认识到自己的错误,这种选择排列在两种汉堡都有剩余的时候才是等概率的。。

所以c(n,n/2)中有很多不成立的情况。

计算变得简单起来。。

f[n] = 2^(2-n)*c(n-2,(n-2)/2);

然后推得递归关系: f[n+2] = (n-1)/n*f[n];

代码如下:

#include <cstdio>
#include <cmath>
#define N 100000
double p[N+5];
int init()
{
    p[2] = 1.0;
    for(int i = 2; i < N; i++)
    p[i+2] = 1.0*(i-1)/i*p[i];
}
int main ()
{
    int n, t;
    init();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%.4lf\n",1-p[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值