题目大意

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

  \(n\leq 10000\)

题外话

  如果买第\(k\)种需要\(k\)元钱要怎么做?

  已经买了\(i\)张,买到下一张需要的期望钱数是\(\frac{n}{n-i}\times\frac{n+1}{2}\)

  所以总的代价是

\[\sum_{i=0}^{n-1}\frac{n(n+1)}{2(n-i)}=\frac{n(n+1)}{2}\sum_{i=1}^{n}\frac{1}{i}
\]

  可惜这题没那么简单。

题解

  设\(p(x,i)\)为已经买了\(i\)个物品,通过\(x\)次购买买完剩下的物品的概率

  设\(g_i\)为已经买到了\(i\)个物品,买完所有物品的期望次数

\[g_i=g_{i+1}+\frac{n}{n-i}
\]

  下一次买到想要的物品的概率为\(\frac{n-i}{n}\),取倒数就是期望

  还有一条式子

\[g_i=\sum_{x=1}^\infty x\times p(x,i)
\]

  买\(x\)次成功的概率乘以\(x\)

  设\(f_{i,j}\)为已经买到了\(i\)个物品,之间买过\(j\)次,买完所有物品的花费

  有一个递推式

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

\[\begin{align}
f_{i,j}&=\sum_{x=1}^\infty ((j+1)+(j+2)+\cdots(j+x))\times p(x,i)\\
&=\sum_{x=1}^\infty \frac{x(x+2j+1)}{2}\times p(x,i)
\end{align}
\]

  作差得

\[f_{i,j+1}-f_{i,j}=\sum_{x=1}^\infty x\times p(x,i)=g_i\\
f_{i,j+1}=f_{i,j}+g_i\\
\]

  代入到递推式中得

\[\begin{align}
f_{i,j}&=(f_{i,j}+g_i)\times\frac{i}{n}+(f_{i+1,j}+g_{i+1})\times\frac{n-i}{n}+(j+1)\\
f_{i,j}&=\frac{i}{n}f_{i,j}+\frac{i}{n}g_{i}+\frac{n-i}{n}f_{i+1,j}+\frac{n-i}{n}g_{i+1}+(j+1)\\
f_{i,j}&=\frac{i}{n-i}g_{i}+f_{i+1,j}+g_{i+1}+\frac{n}{n-i}(j+1)
\end{align}
\]

  可以发现\(f_{i,j}\)只和\(j\),\(f_{i+1,j}\),\(g_{i}\),\(g_{i+1}\)有关。因为我们只要求\(f_{0,0}\),所以可以把\(j\)那一维删去

\[f_{i}=\frac{i}{n-i}g_i+f_{i+1}+g_{i+1}+\frac{n}{n-i}
\]

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
double g[100010];
double f[100010];
int main()
{
int n;
scanf("%d",&n);
int i;
g[n]=0;
for(i=n-1;i>=0;i--)
g[i]=g[i+1]+double(n)/(n-i);
f[n]=0;
for(i=n-1;i>=0;i--)
f[i]=f[i+1]+double(i)/(n-i)*g[i]+g[i+1]+double(n)/(n-i);
printf("%.2lf\n",f[0]);
return 0;
}

【BZOJ1426】收集邮票 期望DP的更多相关文章

  1. 【BZOJ】1426: 收集邮票 期望DP

    [题意]有n种不同的邮票,第i次可以花i元等概率购买到一种邮票,求集齐n种邮票的期望代价.n<=10^4. [算法]期望DP [题解]首先设g[i]表示已拥有i张邮票集齐的期望购买次数,根据全期 ...

  2. 收集邮票 (概率dp)

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

  3. 2018.08.31 bzoj1426 收集邮票(期望dp)

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

  4. 【BZOJ1426】收集邮票 期望

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

  5. bzoj1426: 收集邮票(期望)

    推错半天式子T T 设f[i]为买了i种卡,期望再买几张有n种卡 设g[i]为买了i种卡,期望再花多少钱有n种卡 可以把当前买卡的价格看作1,则以后买的所有卡片要增加1元,于是要加上f[i]和f[i+ ...

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

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

  7. 【BZOJ1426】收集邮票 概率DP 论文题 推公式题

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  8. 嘴巴题7 BZOJ1426: 收集邮票

    Time Limit: 1 Sec Memory Limit: 162 MB Submit: 546 Solved: 455 [Submit][Status][Discuss] Description ...

  9. Bzoj1426 收集邮票

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 292  Solved: 232 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一 ...

随机推荐

  1. Success Rate CodeForces - 807C (数学+二分)

    You are an experienced Codeforces user. Today you found out that during your activity on Codeforces ...

  2. 使用C# HttpWebRequest进行多线程网页提交。Async httpclient/HttpWebRequest实现批量任务的发布及异步提交和超时取消

    使用线程池并发处理request请求及错误重试,使用委托处理UI界面输出. http://www.cnblogs.com/Charltsing/p/httpwebrequest.html for (i ...

  3. Spring配置文件beans.xml头部配置解释

    Spring配置文件beans.xml头部配置解释 - EasonJim - 博客园https://www.cnblogs.com/EasonJim/p/6880329.html

  4. Java Serializable的使用和transient关键字使用小记(转载)

    一:Serializable 1.持久化的简单介绍: “持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间.通过序列化一个对象,将其写入磁盘,以后在程 ...

  5. CPU Cache 机制以及 Cache miss

    CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...

  6. Appscanner实验还原code3

    # Author: Baozi #-*- codeing:utf-8 -*- import _pickle as pickle from sklearn import ensemble import ...

  7. linux之nload和iftop查看网络使用情况

    操作系统: centos7 nload: yum install -y gcc yum install -y gcc-c++ yum install -y ncurses-devel yum inst ...

  8. k8s授权访问

    #监听本地的8080端口 kubectl  proxy --port=8080 [root@k8s-m ~]# kubectl proxy --port=8080Starting to serve o ...

  9. sonar安装

    ##jdk不要用yum下载的 一.下载sonar源码 cd /usr/local/src wget https://sonarsource.bintray.com/Distribution/sonar ...

  10. python数据结构与算法第十一天【希尔排序】

    1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...