zoukankan      html  css  js  c++  java
  • 【FZYZOJ】「Paladin」瀑布 题解(期望+递推)

    题目描述

    CX在Minecraft里建造了一个刷怪塔来杀僵尸。刷怪塔的是一个极高极高的空中浮塔,边缘是瀑布。如果僵尸被冲入瀑布中,就会掉下浮塔摔死。浮塔每天只能工作 $t$秒,刷怪笼只能生成 $N$ 只僵尸,这些僵尸在一开始就全部生成,位于瀑布上。由于CX是拿着手机搭的浮塔,难免有些建筑方面的缺陷,导致不是所有僵尸都会被冲下去。详细地说,在这 $t$秒内,每秒冲下一只僵尸(如果有的话)的概率为 $P$ ,这只僵尸一秒内没有被冲下的概率为$1-P$

    CX想知道他一天内杀死的僵尸的期望数量。

    输入格式

    输入共一行,三个数N、P、t如题意。

    输出格式

    输出数学期望,并四舍五入保留七位小数。

    --------------------------------------------------

    设$f[i][j]$表示$i$秒冲下$j$只僵尸的概率。得到递推式:

    $f[i][j]=p*f[i-1][j-1]+(1-p)*f[i-1][j]$

    特别地,有:

    $f[i][n]=f[i-1][n]+p*f[i-1][n-1]$

    注意边界:$f[0][0]=1,f[i][0]=(1-p)*f[i-1][0],f[0][i]=0$。

    $ans=sumlimits_{i=1}^n f[t][i]*i$

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    double ans,f[2001][2001],p,q;
    int n,t;
    int main()
    {
        scanf("%d%lf%d",&n,&p,&t);
        q=1-p;
        f[0][0]=1;
        for (int i=1;i<=n;i++) f[0][i]=0;
        for (int i=1;i<=t;i++) f[i][0]=q*f[i-1][0];
        for (int i=1;i<=t;i++)
            for (int j=1;j<=n-1;j++)
                f[i][j]=p*f[i-1][j-1]+q*f[i-1][j];
        for (int i=1;i<=t;i++) f[i][n]=f[i-1][n]+p*f[i-1][n-1];
        for (int i=1;i<=n;i++) ans+=f[t][i]*i;
        printf("%.7lf",ans);
        return 0;
    } 
  • 相关阅读:
    团队项目
    四则运算
    关于软件工程的问题
    自我介绍
    各种排序
    2017年03月14日 新模块投产日记
    第一发和技术无关的博客
    分享一款好用的PHP下ID混淆插件
    批量抓取cisco设备配置脚本编写(expect/sed/awk/shell)
    ntp/heartbeat/postfix/dns故障处理记录
  • 原文地址:https://www.cnblogs.com/Invictus-Ocean/p/12934413.html
Copyright © 2011-2022 走看看