长沙理工大学第十三届程序设计竞赛--C 取手机

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

durong有a台iphonex和b台s8,并且放在一个保险箱里,durong现在一台一台从保险箱随机拿出这些手机,现在他想知道第k次拿出s8的概率是多少

输入描述:

第一行一个正整数T,表示数据组数。(1<=T<=10000)
接下来T行输入a,b,k
其中(1<=a,b,k<=1e9) k<=a+b;

输出描述:

第k次拿出s8的概率,保留三位小数

这是一道很有意思的题目,因为起初一看起来,就是一个数学概率题,似乎还不简单~

但是如果我们想到了抽签抓阄的话,那就好做了,这个和抽签抓阄的原理是一样的,不是吗?

所以放心大胆的得出概率是b/(b+a)。

当然,数学是严谨的,我们也得讲道理。

可以简单的证明一下,为什么概率还是b/(b+a)?

第一次拿到S8的概率:b/(b+a)   那么没拿到的概率就是 a/(b+a)

 第二次计算时就要依据第一次拿没拿到的情况了:当第一次拿到和第一次没拿到,其概率为[b/(b+a)][(b-1)/(b+a-1)]+[a/(b+a][(b-1)/(b+a-1)] = b/(a+b),同理,第二次拿不到的概率[b/(b+a)][a/(b+a-1)]+[a/(b+a)][a/(b+a-1)] = a/(a+b),

同理,以此递推到第K次(k<b),概率都是如此,因为递推式一样。

这就说明前面拿不拿到S8对第K次拿S8是没有影响的。

 

第K次拿到S8

第K次没拿到S8

K = 1

b/(a + b)

a/(a + b)

K = 2

b/(a + b)

a/(a + b)

K = 3

b/(a + b)

a/(a + b)

K = n

b/(a + b)

a/(a + b)

因此,理清了就很容易地AC了

#include <iostream>
using namespace std;
int main()
{
    int t,a,b,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d %d",&a,&b,&k);
        printf("%.3f\n",b*1.0/(a+b));
    }
     
    return 0;
}

阅读更多
换一批

没有更多推荐了,返回首页