题目链接:Click here

Solution:

本题直接推价格似乎很难,考虑先从购买次数入手

设购买次数\(g(i)\)为当前有\(i\)种不同的邮票,要买到\(n\)种的期望购买次数

可以由期望的定义得到式子:\(g(x)=\sum_{i=0}^{+\infty}P(i,x)\),其中\(P(i,x)\)为买\(i\)次从\(x\)种买到\(n\)种的概率

对于一个局面,记它可以转移到的局面集合为\(to\),则它的期望可以表示为

\[E(u)=\sum_{v\in to_u}(E(v)+cost(v,u))P(v)
\]

其中\(P(v)\)表示从\(v\)局面转移到\(u\)局面的概率,\(cost(v,u)\)表示从\(v\)转移到\(u\)局面的的代价

那么对于本题也可以如此转化:\(g(x)=\frac{x}{n}(g(x)+1)+\frac{n-x}{n}(g(x+1)+1)\)

也很好理解,因为再抽一张卡,可能抽到已经抽到的,也可能抽到新的,而转移的代价都为1

显然,\(g(n)=0\),再把式子转化一下,就可以得到\(g(x)\)的计算方式:

\[\frac{n-x}{n}g(x)=\frac{n-x}{n}g(x+1)+1\\
g(x)=g(x+1)+\frac{n}{n-x}
\]

然后我们再考虑设\(f(i,j)\)表示当前有\(i\)种邮票,下次购买要花\(j\)元时,买到\(n\)种的期望花费

我们知道购买要\(j\)元,结合题意,就能很好的推出\(f(i,j)\)的转化方程:

\[f(i,j)=\frac{i}{n}(f(i,j+1)+j)+\frac{n-i}{n}(f(i+1,j+1)+j)\\
f(i,j)=\frac{i}{n}f(i,j+1)+\frac{n-i}{n}f(i+1,j+1)+j\\
\]

我们考虑一下\(f(i,j)\)的定义,便可以得出式子:

\[f(i,j)=\sum_{u=0}(j+(j+1)+\dots+(j+u-1))P(u,i)\\
f(i,j)=\sum_{u=0}\frac{u(2j+u-1)}{2}P(u,i)\\
\]

这里\(P\)的定义同上文\(g(x)\)定义式中的\(P\),然后我们再考虑表示\(f(i,j+1)\),很简单,带入即可

\[f(i,j+1)=\sum_{u=0}\frac{u(2j+u+1)}{2}P(u,i)
\]

考虑表示将\(f(i,j+1)\)减去\(f(i,j)\)可得:\(f(i,j+1)-f(i,j)=\sum_{u=0}uP(u,i)\)

可以发现它与前面的期望定义式是一样的,则我们得到式子:\(f(i,j+1)=f(i,j)+g(i)\)

则我们可以把\(f(i,j)\)表示一下:

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

事实上我们只需求出\(f(0,1)\),而在递推中可以发现\(j\)是没有变化的,则可以直接忽略\(j\)

\[f(i)=\frac{i}{n}(f(i)+g(i))+\frac{n-i}{n}(f(i+1)+g(i+1))+1\\
\frac{n-i}{n}f(i)=\frac{i}{n}g(i)+\frac{n-i}{n}f(i+1)+\frac{n-i}{n}g(i+1)+1\\
f(i)=\frac{i}{n-i}g(i)+f(i+1)+g(i+1)+\frac{n}{n-i}
\]

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+1;
int n;double u,f[N],g[N];
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read();f[n]=g[n]=0;u=n;
for(int i=n-1;~i;i--) g[i]=g[i+1]+u/(u-i);
for(int i=n-1;~i;i--){
double x=i,y=n-i;
f[i]=f[i+1]+g[i+1]+x/y*g[i]+u/y;
}Pintf("%.2lf",f[0]);
return 0;
}

题外话:推的时候发现了另外一个式子:设\(P(x)\)表示用\(x\)步刚好取到所有邮票的概率,则:

\[P(x)=\frac{1}{n}\Pi_{i=0}^{n-2}\frac{n-i}{n}\Pi_{i=1}^{x-n}\frac{n-1}{n}\\
P(x)=\frac{n!(n-1)^{x-n}}{n^x}
\]

式子也很好理解,保证最后取到没取到的那种,再取完其它的种类,剩下的步数只要不取到最后那枚就行

则本题也可以这样求:

\[sum(n)=\sum_{i=1}^ni\\
E(0)=\sum_{i=n}^{+\infty}P(i)sum(i)
\]

然后对这个式子求个通项就行了,不过我还不会求。。。

Luogu P4550 收集邮票的更多相关文章

  1. P4550 收集邮票

    P4550 收集邮票 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由 ...

  2. P4550 收集邮票-洛谷luogu

    传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢 ...

  3. bzoj1426 (洛谷P4550) 收集邮票——期望

    题目:https://www.luogu.org/problemnew/show/P4550 推式子……:https://blog.csdn.net/pygbingshen/article/detai ...

  4. 洛谷P4550 收集邮票(概率期望)

    传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...

  5. P4550 收集邮票 与 灵异的期望

    考前复习一下期望相关知识,这题的期望还是很巧妙的. 设 \(f_{i}\) 表示已经买到了 \(i\) 张不同的邮票的期望步数,\(g_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票的期望花 ...

  6. [洛谷P4550]收集邮票

    题目大意:有$n(n\leqslant10^4)$个物品,第$i$次会从这$n$个物品中随机获得一个,并付出$i$的代价,问获得所有的$n$个物品的代价的期望. 题解:令$f_i$表示现在已经获得了$ ...

  7. [P4550] 收集邮票 - 概率期望,dp

    套路性地倒过来考虑,设\(f[i]\)表示拥有了\(i\)种票子时还需要多少次购买,\(g[i]\)表示还需要多少钱 推\(g[i]\)递推式时注意把代价倒过来(反正总数一定,从顺序第\(1\)张开始 ...

  8. 【BZOJ-1426】收集邮票 概率与期望DP

    1426: 收集邮票 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 261  Solved: 209[Submit][Status][Discuss] ...

  9. 【BZOJ1426】收集邮票 期望

    [BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...

随机推荐

  1. for循环练习题:拆解字符并输入下标

    test = input('请输入:') for item in range(0,len(test)): print(item,test[item])

  2. RSA加密 抛异常 algid parse error, not a sequence

    JDK1.8环境 参考:BouncyCastle的使用:https://blog.csdn.net/qq_29583513/article/details/78866461 可解决 公钥解密 私钥加密 ...

  3. 为webService添加Interceptor(拦截器)

    今天写一个简单的拦截器,以webService接口为例: 背景:H5的一个项目,只要调用H5webService 接口下面的方法都会触发一个AuthorityInterceptor去验证是否调用类型是 ...

  4. Linux中如何添加/删除FTP用户并设置权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被设置用户名为test.被限制路径为/home/test 2.创建建用户:在root用户下:   user ...

  5. .Net Core 认证系统源码解析

    不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Cor ...

  6. 机器学习及scikit-learn

    一.机器学习以及scikit-learn 1. 机器学习基本步骤: (1)定义一系列函数  =>   (2)定义函数的优劣  =>  (3)选择最优函数 2.什么是scikit-learn ...

  7. Struts2对于BigDecimal类型的转换问题

    Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. BigDecimal其实也算作是一种常用的数据类型,但Struts2没有对该类型设置转换 ...

  8. 在html中展示pdf

    pc端 插件: https://pdfobject.com/ 使用: <!doctype html> <html lang="en"> <head&g ...

  9. net 网站过滤器 mvc webapi

    WebApi过滤器1 public class TestController : ApiController { /// <summary> /// 获取用户信息 /// </sum ...

  10. 84. Largest Rectangle in Histogram (JAVA)

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...