Codeforces 107B Basketball Team 简单概率

本文介绍了一种计算在给定部门人数的情况下,随机选取特定数量员工时,至少有一名来自指定部门的概率的方法。通过数学公式推导,采用逆向思维减少复杂度,最终实现高效的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

题意:

给定n m h

表示有m个部门,有个人如今在部门h

以下m个数字表示每一个部门的人数。(包含他自己)

在这些人中随机挑选n个人,问挑出的人中存在和这个人同部门的概率是多少。

这个人一定在挑出的n个人中。

反向思考。答案是 1 - 不可能概率

不可能概率 = C(n-1, sum-1-a[h]) / C(n-1, sum-1)

发现2个组合数的分母部分同样,所以仅仅须要把2个组合数的分子部分相除就可以。


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define N 10010
int n, m, h, a[N];

void solve(){
    int sum = 0;
    for(int i = 1; i <= m; i++) scanf("%d",&a[i]), sum += a[i];
    if(sum < n){
        puts("-1");return ;
    }
    n--;
    sum--; a[h]--;
    if(sum - a[h] < n){puts("1");return;}
    double ans = 1.0;
    double x = sum-a[h], y = sum;
    for(int i = 1; i <= n; i++) {
        ans *= x / y;
        x--; y--;
    }
    printf("%.10f\n", 1.0 - ans);
}
int main(){
    while(~scanf("%d %d %d",&n,&m,&h)){
        solve();
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值