[hdu5985]概率题的推导

原创 2016年11月30日 23:04:09

题目描述

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 概率,推导

题目大意:给你n种硬币,并给你每种硬币的个数和正面朝上的概率p。每次将所有的硬币投掷一下。背面朝下的抛弃。直到只剩下一种硬币或者没有硬币。最后剩下的那种硬币叫幸运硬币,问每种硬币成为幸运硬币的概率。 ...
  • qq_33132383
  • qq_33132383
  • 2017年10月09日 14:13
  • 58

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

该问题包含两个子问题: 子问题1:给你一个骰子,你扔到几,机器将会给你相应的金钱。比如,你扔到6,机器会返回你6块钱,你扔到1,机器会返回你1块钱。请问,你愿意最多花多少钱玩一次? 子问题2:...
  • beiyeqingteng
  • beiyeqingteng
  • 2012年05月06日 13:55
  • 4426

面试中被问到的概率题

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

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

本文总结了面试或笔试中可能考到的概率和组合题。
  • BertDai
  • BertDai
  • 2017年09月23日 12:30
  • 1239

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

前两天的数学期中考里有这样一道题目。 小明要买四个灯泡,商场里有功率为10w和5w的两种型号的灯泡。 (1)画出树状图,求选到相同种类灯泡的概率 (2)要求选购灯泡总功率不超过30w,选...
  • Tessy_yyy
  • Tessy_yyy
  • 2016年11月18日 21:42
  • 175

概率题 面试 笔试

概率题 面试 笔试本文总结了面试或笔试中可能考到的概率题。第1题 一个桶里面有白球、黑球各100个,现在按下述规则取球: - i 、每次从通里面拿出来两个球; - ii、如果取出的是两...
  • cmonkey_cfj
  • cmonkey_cfj
  • 2015年07月12日 16:26
  • 1778

50个概率题

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

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

前一段时间看了看大公司的笔试题,其中有一道关于随机概率的问题,感觉挺好玩的,仔细想了想又不太会搞所以看了一些答案,其中有一种感觉挺好,我就拿出来说说,并且随机概率这类题我也扩展了,和大家分享分享。写的...
  • CodingFarmers
  • CodingFarmers
  • 2012年10月12日 21:44
  • 339

条件概率笔试题

某城市发生了一起汽车撞人逃跑事件,该城市只有两种颜色的车,比例为蓝色15% 绿色85%,事发时有一个目击者在现场看见了,他指证是蓝车 但是根据专家在现场分析,当时那种条件目击者看正确车的颜色的可能性...
  • so_sss
  • so_sss
  • 2014年09月10日 16:08
  • 963

若干面试概率题

若干面试概率题 2014年05月31日 |  分类:面试 |  标签:数学, 概率, 面试 |  评论:9条评论 |  浏览:5,810次 概率论是计算机科学非常重要的基础学科...
  • dengm155
  • dengm155
  • 2016年09月25日 10:50
  • 906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hdu5985]概率题的推导
举报原因:
原因补充:

(最多只允许输入30个字)