zoukankan      html  css  js  c++  java
  • BZOJ 1426: 收集邮票 数学期望 + DP

    Description

    有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且
    买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k
    张邮票需要支付k元钱。现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。

    Input

    一行,一个数字N,  N<=10000

    Output

    要付出多少钱. 保留二位小数

    题解: 

    挺神的一道期望 $DP$.

    令 $f_{i}$ 表示已经有 $i$ 种不同的邮票,还需购买的期望次数.

    令 $g_{i}$ 表示已经有 $i$ 种不同的邮票,还需花的期望钱数.

    先考虑 $f_{i}$ 怎么求.

    依据定义,不难得知 $f_{n}=0$.

    而 $f_{i}=P(没抽到新的) imes 次数 + P(抽到新的) imes 次数$.

    即 $f_{i}=frac{i}{n} imes(f_{i}+1)+frac{n-i}{n} imes(f_{i+1}+1)$.

    整理,得 $f_{i}=frac{n}{n-i}+f_{i+1}$.

    再考虑 $g_{i}$
     
    $g_{i}=(g_{i}+1+f_{i}) imesfrac{i}{n}+(g_{i+1}+1+f_{i+1}) imesfrac{n-i}{n}$.

    考虑一下具体含义:

    依据题目,抽到第 $k$ 张牌的代价为 $k$ 元.

    总代价与抽到卡牌的顺序是无关的.

    我们就可以默认当前抽到的卡牌代价是 $1$ 元,后面的卡牌依次排开.

    考虑未抽到新卡牌的情况:

    已经有 $i$ 种牌到终止局面的代价为 $f_{i}$,抽到当前卡牌的代价已被我们定义为 $1$. 代价是一个依次加 $1$ 的数列,等同于当前局面
    到达 $f_{i}$ 后,每张卡牌的代价都要比原来多 $1$.

    而根据我们定义的方程,已有 $i$ 张后,我们期望抽的次数是 $f_{i}$.

    那么,对于 $f_{i}$ 张卡片,每张的价格都加 $1$ 即可.

    对于 $g_{i+1}$ 的情况同理即可.

    $g_{i}=(g_{i}+1+f_{i}) imesfrac{i}{n}+(g_{i+1}+1+f_{i+1}) imesfrac{n-i}{n}$,整理一下即可. 
     
    #include <bits/stdc++.h>
    using namespace std; 
    double n,f[10010],s[10010];
    int main()
    {
        scanf("%lf",&n);
        for(int i=n-1;i>=0;i--)
        {
            s[i]=s[i+1]+n/(n-i);
            f[i]=f[i+1]+s[i+1]+s[i]*i/(n-i)+n/(n-i);
        }
        printf("%.2f",f[0]);
        return 0;
    } 
    

      

  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/guangheli/p/10983501.html
Copyright © 2011-2022 走看看