Codeforces 107B Basketball Team 简单概率

题目链接:点击打开链接

题意:

给定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;
}
时间: 2024-10-05 23:37:07

Codeforces 107B Basketball Team 简单概率的相关文章

CF 107B Basketball Team [排列组合]

类似高中的盒子取球,关键理解题意 问题转化为,从m个盒子中取n个球,在取了h盒中的一个球的条件下,h盒还取了别的球的概率 可以这样求得 sum表示m个盒子中总共有多少个球 从sum-1中取n-1个球的情况数是总情况数 减去从sum-m[h]取n-1个球的情况数 即是要求的情况数 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <al

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

POJ 3071 Football(简单 概率DP)

Football 原文链接:http://blog.csdn.net/xuechelingxiao/article/details/38520105 大意:2^n 个球队进行单场淘汰赛,每两只球队之间比赛会有胜负的概率,问最后谁夺冠的概率最大. 思路:简单的概率DP问题,主要是怎么处理哪两个球队比赛的问题. DP方程为 dp[i][j] = ∑(dp[i-1][j]*dp[i-1][k]*p[j][k]); //dp[i][j]表示第 i 轮的时候,第 j 支队伍赢的概率.. 对于其中位运算,可

Codeforces 444B DZY Loves FFT(概率)

题目连接:Codeforces 444B DZY Loves FFT 题目大意:根据题目的算法生成a,b数组,然后对于每个长度的l,求a[i]*b[l-i]的最大值. 解题思路:概率问题,枚举前30大的数,如果有就可以直接输出答案,如果没有,就暴力枚举b数组为1的位置找最大值. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long

Aeroplane chess(简单概率dp)

Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6). Whe

uva 1636 - Headshot(简单概率问题)

直接扣一枪没有子弹 是条件概率 转一下再扣一枪 是简单事件发生的概率 前者用00的个数除以00和01子串的总数 后者用0的个数除以所有数字的个数 然后换算一下运算方式比较即可 #include<cstdio> #include<cstring> const int maxn = 105; char s[105]; int cnt0,cnt1,cnt2,cnt3; int main() { while(scanf("%s",s+1)!=EOF) { cnt0=0;

CodeForces 30C Shooting Gallery 简单dp

题目链接:点击打开链接 给定n个气球 下面n行 x y t val 表示气球出现的坐标(x,y) 出现的时刻t,气球的价值val 枪每秒移动1个单位的距离 问: 射击的最大价值,开始时枪瞄准的位置任意. 思路: dp一下.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set

Codeforces 15C Industrial Nim 简单博弈

题目链接:点击打开链接 题意: 给定n 下面n行,每行2个数u v 表示有v堆石子:u,u+1,u+2···u+v-1 问先手必胜还是后手必胜 思路: 首先根据Nim的博弈结论 把所有数都异或一下,看结果是0还是非0 而这里因为数字太多所以想优化 那么其实对于一个序列 u, u+1, u+2 ···· 显然 {4,5} {,6,7}, {8,9} 这样2个一组的异或结果就是1 那么只需要把序列分组,分成{偶数,奇数} 然后Y一下.. #include<stdio.h> #include<

简单概率DP——hdu4405

题目描述: Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6