uva 557 - Burger

  看起来很简单的一道概率题,费了不少周折。还让其他同学推导了一下,不过都陷入了一个错误的思维,忽略的他们得到burger的概率是0.5,而不是1,所以直接算排列组合是错误的。

  看了一下网上一位大牛的做法,才知道自己的想法一开始就错了TAT。这题直接算的话比较麻烦,因为不知道从第几个开始停止抛硬币。反过来算他们俩得到不同面包的概率比较简单。这样硬币就会从头抛到尾。所有的情况就是C(n/2-1, n-2),就是把n/2-1的面包分给前n-2个孩纸。没种情况是概率就是(0.5^n-2),所以a[n]=C(n/2-1, n-2)*(0.5^n-2)=C(n/2-1, n-2)*(2^2-n).

  因为n最大为100000,直接算会超出范围,一边乘一边除也不行。所以要推导一下递归公式:


好简单的公式。= =!

代码:

/*
ID: czq1992
LANG: C++
TASK: 557 - Burger
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double a[100010];
void get()
{
    int i,j;
    a[2]=1;
    for(i=4;i<=100000;i+=2)
    {
        a[i]=a[i-2]*(i-3.0)/(i-2.0);
    }
}
int main()
{
    int n,t;
    get();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%.4f\n",1.0-a[n]);
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值