码迷,mamicode.com
首页 > 其他好文 > 详细

【概率】COGS1487 麻球繁衍

时间:2017-09-16 17:25:33      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:getchar   include   reg   alt   eve   gif   技术分享   time   代码实现   

一开始手推概率,结果发现结果一直对不上。后来发现是计算器没用好。。。

比较好思考的是 求k只麻球的概率  其实是求 一只麻球的概率^k的概率  (因为乘法原理,每个麻球的概率都是相对独立的所以乘起来)

我们设 1只麻球,m天后死亡的概率是 f(m) 

那么根据全概率公式就有 $f(i)=P_0+f(i-1)\times P_1+f(i-1)^{2}\times P_2+f(i-1)^{3}\times P_3 +.....+f(i-1)^{n-1}\times P_n-1$

对于我这种萌新,我第一眼看过去内心是wc的,但是你手推一推会发现其实很好理解:

第一天死亡的只有P0

第二天死亡的会有 昨天产生0个的麻球今天死亡了 昨天产生1个的麻球今天死亡了  昨天产生的2个麻球今天死亡了 昨天产生的3个麻球今天死亡...

第二天死亡的会有 昨天产生0个的麻球今天死亡了 昨天产生1个的麻球今天死亡了  昨天产生的2个麻球今天死亡了 昨天产生的3个麻球今天死亡...

代码实现并不难,只不过需要一定的思考~

技术分享
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
inline int Read(){
    int ans = 0,flag=1;
    char ch=getchar();
    while(ch<0 || ch>9){
        if(ch==-)flag=-1;
        ch=getchar();
    }
    while(ch>=0 && ch<=9){
        ans = ans * 10 + ch - 0;
        ch = getchar();
    }
    return flag*ans;
}

int T;
int n,k,m;
double P[1005],dp[1005];

double Pow(double num,int x){
    double ans = 1;
    while(x){
        if(x&1) ans*=num;
        num*=num;
        x>>=1;
    }
    return ans;
}

int main(){
    freopen("tribbles.in","r",stdin);
    freopen("tribbles.out","w",stdout);
    T = Read();
    for(register int i=1;i<=T;++i){
        n = Read();
        k = Read();
        m = Read();
        for(register int now=0;now<n;++now){
            scanf("%lf",&P[now]);
        }
        dp[0]=0;
        dp[1]=P[0];
        for(register int day = 2;day<=m;++day){
            dp[day] = 0;
            for(register int now = 0 ;now<n;++now) 
            dp[day]+=P[now]*Pow(dp[day-1],now);
        }
        printf("Case #%d: %.7lf\n",i,Pow(dp[m],k));
    }
}
别学我写快速幂啊,直接用Pow不容易出错

 

【概率】COGS1487 麻球繁衍

标签:getchar   include   reg   alt   eve   gif   技术分享   time   代码实现   

原文地址:http://www.cnblogs.com/OIerLYF/p/7531455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!