sgu 508 Black-white balls(贝叶斯公式的应用)

题意:n个球,取出p+q个球,其中黑球p个,白球q个,求一个黑球的取值区间,使得黑球数在该区间概率最低值为p

解析:

设n个球中有k个黑球的事件为Ak ,设取出p+q个球中有p个黑球为事件B
题目所有概率为sum{p(Ak|B)}>=pri的k的取值区间
p(Ak|B)不好求解,通过贝叶斯公式p(Ak|B) = p(B|Ak)*p(Ak)/p(B)其中
p(B|Ak) = C(p, k) * C(q, n-k) / C(p+q, n);
p(B) = sum( p(B|Ak) * p(Ak) ) k = 0...n;
由于有多少个黑球是等概率的,因此p(Ak)可以提出来约掉
p(Ak|B) = p(B|Ak) / sum( p(B|Ak) );
p(Ak|B) = (C(p, k) * C(q, n-k)) / sum( (C(p, t) * C(q, n-t)) ) 其中t的取值
为枚举的区间[0, n]
上式能够用来求出某个k值的概率值,由于需要枚举一个区间,那么将

这个区间的所有概率相加即可

#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
#define PI acos(-1.0)
typedef long long LL;
const double EPS=1e-12;

LL c[55][55],temp;
int n,p,q,pri;
void inint()
{
   memset(c,0,sizeof(c));
   c[0][0]=1;
   int i,j;
   for(i=1;i<55;i++)
   {
       c[i][0]=1;
       for(j=1;j<=i;j++)
         c[i][j]=c[i-1][j-1]+c[i-1][j];
   }
}

int sign(double x)
 {
    return x < -EPS ? -1 : x > EPS;
}

void solve()
{
    int i,j,k;
    temp=0;
    LL res;
    for(j=p;j+q<=n;j++)
      temp+=c[j][p]*c[n-j][q];
    int left=0,right=0,len=100;
    for(i=0;i<=n;i++) //因为p可以为0,所以必须全部搜一遍
    {
       for(j=i;j<=n;j++)
       {
           res=0;
           if(j-i+1>=len) continue;
           for(k=i;k<=j;k++)
           {
              res+=c[k][p]*c[n-k][q];
           }
           if( sign(res*100.0/temp-pri)>=0 )
           {
               left=i;
               right=j;
               len=j-i+1;
           }
       }
    }
    printf("%d %d\n",left,right);
}
int main()
{
    inint();
    while(~scanf("%d%d%d%d",&n,&p,&q,&pri))
    {
      solve();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值