# [hdu5985]概率题的推导

## 题目描述

Bob has collected a lot of coins in different kinds. He wants to know which kind of coins is lucky. He finds out a lucky kind of coins by the following way. He tosses all the coins simultaneously, and then removes the coins that come up tails. He then tosses all the remaining coins and removes the coins that come up tails. He repeats the previous step until there is one kind of coins remaining or there are no coins remaining. If there is one kind of coins remaining, then this kind of coins is lucky. Given the number of coins and the probability that the coins come up heads after tossing for each kind, your task is to calculate the probability for each kind of coins that will be lucky.

## 算法思路

1. 这一题在比赛的时候我想的太多了,切分的子问题太多反而导致求解变得十分困难,最后导致我们没有A下这一题,可以说责任在我。
2. 思路的话十分简单,首先,我们先计算出到达第k步的时候硬币i死亡的概率
kill[i][j]=(1p[i]j)num[i]

我们就可以计算出到达第i步之后i存活的概率
recv[i][j]=1kill[i][j]

那么,我们就可以得到某一个硬币i成为lucky coins的概率
ans[i]=j=1max(recv[i][j]recv[i][j+1)k=0,kinkill[k][j]

这个max是如何确定呢,我们知道所有的概率都在0.4-0.6之间,而总的硬币的个数在100000之内,我们就可以计算收敛的速度了。

## 代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

#define MAXN 75
#define MAXM 15

int t,n;
int num[MAXM];
double p[MAXM];
double killed[MAXM][MAXN+5];
double recv[MAXM][MAXN+5];
double ans[MAXM];

void Solve()
{
int i,j,k;

for(i=0;i<MAXM;i++)
ans[i] = 0.0;

if(n==1){
printf("%.6f\n",1.0);
return;
}

for(i=0;i<n;i++){
double tmp = p[i];
for(j=1;j<=MAXN;j++){
killed[i][j] = pow(1-tmp,num[i]);
recv[i][j] = 1 - killed[i][j];
tmp *= p[i];
}
}

for(i=0;i<n;i++){
for(j=1;j<MAXN;j++){
double tmp = 1.0;
for(k=0;k<n;k++){
if(k!=i)
tmp *= killed[k][j];
}
ans[i] += (recv[i][j]-recv[i][j+1])*tmp;
}
}

for(i=0;i<n;i++)
printf("%.6f%c",ans[i],(i==n-1)?'\n':' ');

return;
}

int main()
{
freopen("input","r",stdin);
int i;

scanf("%d",&t);

while(t--){
scanf("%d",&n);

for(i=0;i<n;i++)
scanf("%d%lf",&num[i],&p[i]);

Solve();
}
return 0;
}

• 本文已收录于以下专栏：

## hdu5985 概率，推导

• qq_33132383
• 2017年10月09日 14:13
• 58

## 一道有意思的Amazon的概率面试题[# 71]

• beiyeqingteng
• 2012年05月06日 13:55
• 4426

## 面试中被问到的概率题

1.   飞机座位中的疯子问题 100人坐飞机，第一个乘客在座位中随便选一个坐下，第100人正确坐到自己坐位的概率是？他们分别拿到了从1号到100号的座位，这些乘客会按号码顺序登机并应当对号入座，如果...
• weixin_37974811
• 2017年04月09日 14:41
• 185

## 互联网公司 概率面试题整理

• BertDai
• 2017年09月23日 12:30
• 1239

## 一道普通的初三的概率问题

• Tessy_yyy
• 2016年11月18日 21:42
• 175

## 概率题 面试 笔试

• cmonkey_cfj
• 2015年07月12日 16:26
• 1778

## 50个概率题

1. 袜子抽屉一个抽屉有红袜子和黑袜子，随机取出两支袜子都是红袜子的概率是0.5,(a)抽屉里最少有几只袜子？(b)如果抽屉中黑袜子的数量是偶数，抽屉里最少有几只袜子？ (a)4 (b)21 2...
• q1w2e3r4470
• 2017年03月04日 16:41
• 1015

## 微软、谷歌、腾讯等笔试题之随机概率问题

• CodingFarmers
• 2012年10月12日 21:44
• 339

## 条件概率笔试题

• so_sss
• 2014年09月10日 16:08
• 963

## 若干面试概率题

• dengm155
• 2016年09月25日 10:50
• 906

举报原因： 您举报文章：[hdu5985]概率题的推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)