zoukankan      html  css  js  c++  java
  • 洛谷P4550 收集邮票(概率期望)

    传送门

    神仙题啊……这思路到底是怎么来的……

    ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元

    我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P(x,i)$表示买$x$次能从$i$张买到$n$张的概率,则有$$g[i]=sum_{x=0}^infty x imes P(x,i)$$

    然后考虑一下递推关系式,有$$g[i]=g[i+1]+frac{n}{n-i},g[n]=0$$

    于是就可以愉快的递推了

    然后设$f[i][j]$表示现在有$i$张邮票,下一张邮票要花$j$元,买到$n$张的期望花费。不难发现如下的递推式$$f[i][j]=j+f[i][j+1] imes frac{i}{n}+f[i+1][j+1] imes frac{n-i}{i}$$

    然而因为$j$可能是无限大,所以我们没办法简单的递推。

    于是换一个角度思考,我们考虑在$f[i][j]$的情况下还需要买几次才能够买齐,则有$$f[i][j]=sum_{x=0}^infty (j+(j+1)+...+(j+x-1)) imes P(x,i)$$

    其中$x$表示枚举次数,小括号里是$x$次购买所需的花费

    继续推$$f[i][j]=sum_{x=0}^infty frac{x(2j+x-1)}{2} imes P(x,i)$$

    然后把$j+1$带进去,可以得出$$f[i][j+1]-f[i][j]=sum_{x=0}^infty x imes P(x,i)=g[i]$$

    然后再考虑一下原来的递推公式$$f[i][j]=j+f[i][j+1] imes frac{i}{n}+f[i+1][j+1] imes frac{n-i}{i}$$

    $$f[i][j]=j+(f[i][j]+g[i]) imes frac{i}{n}+(f[i+1][j]+g[i+1]) imes frac{n-i}{i}$$

    然后移项之后可得$$f[i][j]=frac{(j+g[i] imes frac{i}{n}+(f[i+1][j]+g[i+1]) imes frac{n-i}{i}) imes n}{n-i}$$

    然后考虑一下,因为答案是$f[1][0]$,所以所有$j$不等于$0$的情况对我们都没有用,于是可以把第二维省略,只考虑$j=0$的情况

    $$f[i]=frac{(j+g[i] imes frac{i}{n}+(f[i+1]+g[i+1]) imes frac{n-i}{i}) imes n}{n-i}$$

    边界条件为$f[n]=0$

    然后就可以直接递推了

     1 //minamoto
     2 #include<cstdio>
     3 const int N=10005;
     4 double f[N],g[N],m;int n;
     5 int main(){
     6     scanf("%d",&n),f[n]=g[n]=0,m=n;
     7     for(int i=n-1;i>=0;--i) g[i]=g[i+1]+m/(m-i);
     8     for(int i=n-1;i>=0;--i)
     9     f[i]=((f[i+1]+g[i+1])*(m-i)/m+g[i]*i/m+1.0)*m/(m-i);
    10     printf("%.2lf
    ",f[0]);
    11     return 0;
    12 }
  • 相关阅读:
    RabbitMQ安装
    windows下安装Erlang
    利用StopWatch类监控Java代码执行时间并分析性能
    HttpClinet工具类
    Javap与JVM指令
    idea全局护眼色绿豆沙
    删除注册在Eureka的服务(无效,多余)
    Steam之两个list间交集、并集、差集
    微服务与SpringCloud简介
    VS code 豆沙绿护眼主题
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9792416.html
Copyright © 2011-2022 走看看