1426: 收集邮票

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 261  Solved: 209
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3

Sample Output

21.25

HINT

Source

Solution

第一次见概率题这么做的...好厉害

首先我们定义$g[i]$表示现在有$i$张,要买到$n$张的期望次数;

定义$P(x,i)$为买$x$次能从$i$种买到$n$种的概率。

那么可以得到:

$$g[i]=\sum _{x=0}^{\infty }x*P(x,i)$$

那么就有:

$$g[i]=g[i]*\frac{i}{n}+g[i+1]*\frac{n-i}{n}+1$$

$$g[i]-g[i]*\frac{i}{n}=g[i+1]*\frac{n-i}{n}+1$$

$$g[i]*\frac{n-i}{n}=g[i+1]*\frac{n-i}{n}+1$$

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

得到$g[i]=g[i+1]+\frac{n}{n-i}$ ,且知道$g[n]=0$

那么我们设$f[i][j]$表示还现在有$i$张,下一张是$j$元,买到$n$张的期望

显然$f[i][j]$到$f[i][j+1]$的概率是$\frac{i}{n}$,到$f[i+1][j+1]$的概率是$\frac{n-i}{n}$,并且付出的代价都是$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_{x=0}^{\infty }[j+(j+1)+...+(x+j-1)]*P(x,i)$$

显然是个等差数列求和,所以可以得到:

$$f[i][j]=\sum _{x=0}^{\infty }\frac{x*[(j)+(x+j-1)]}{2}*P(x,i)$$

然后我们作差$f[i][j+1]-f[i][j]$得到:

$$f[i][j+1]-f[i][j]=\sum_{x=0}^{\infty}x*P(x,i)  \Leftrightarrow  f[i][j+1]-f[i][j]=g[i]$$

所以我们就可以对开始时$f[i][j]$这个式子进行化简,得到:

$$f[i][j]=f[i][j+1]*\frac{i}{n}+f[i+1][j+1]*\frac{n-i}{n}$$

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

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

然后我们发现$j$这一维其实是无效的,我们只需要知道$j=1$时的答案,所以我们在转移的时候忽略它,直接令$j=1$,并用$f[i]$表示$f[i][1]$,得到:

$$f[i]=f[i+1]+g[i+1]+g[i]*\frac{i}{n-i}+\frac{n}{n-i}$$

然后我们就可以线性时间得到答案了。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXN 10010
int N;
double g[MAXN],f[MAXN];
int main()
{
scanf("%d",&N);
for (int i=N-1; i>=0; i--) g[i]=g[i+1]+1.0*N/(N-i);
for (int i=N-1; i>=0; i--) f[i]=f[i+1]+g[i+1]+g[i]*1.0*i/(N-i)+1.0*N/(N-i);
printf("%.2lf\n",f[0]);
}

  

码量比思路量不知道小到哪去了!!

【BZOJ-1426】收集邮票 概率与期望DP的更多相关文章

  1. BZOJ 1426--收集邮票(概率与期望&DP)

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

  2. BZOJ 1426 收集邮票 ——概率DP

    $f(i)$表示现在有$i$张,买到$n$张的期望 所以$f(i)=f(i+1)+\frac {n}{n-i}$ 费用提前计算,每张邮票看做一元,然后使后面每一张加1元 $g(i)$表示当前为$i$张 ...

  3. BZOJ 1426: 收集邮票 数学期望 + DP

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

  4. BZOJ 1426: 收集邮票 [DP 期望 平方]

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

  5. bzoj 1426: 收集邮票【期望dp】

    我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]*(i/n)+f[i+1]*((n-i)/n)+1 然后设g[i ...

  6. bzoj 1426:收集邮票 求平方的期望

    显然如果收集了k天,ans=k*(k+1)/2=(k^2+k)/2.那么现在要求的就是这个东西的期望. 设f[i]表示已有i张邮票,收集到n张的期望次数,g[i]表示已有i张邮票,收集到n张的次数的平 ...

  7. bzoj 1426 收集邮票

    f[i]:当前已拥有i种邮票,还需要买的邮票数的期望值. g[i]:当前已拥有i种邮票,还需要的钱的期望值. 每张邮票初始都是1元钱,每买一张邮票,还没购买的邮票每张都涨价1元.  f[i]=1+(n ...

  8. 收集邮票 (概率dp)

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

  9. 【算法学习笔记】概率与期望DP

    本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...

随机推荐

  1. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  2. 学习Maven之Maven Enforcer Plugin

    1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...

  3. MySQL更改数据库数据存储目录

    MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...

  4. 简述SQL2008部署多实例集群(学习)

    数据库集群     集群的存在意义是为了保证高可用.数据安全.扩展性以及负载均衡. 什么是集群? 由二台或更多物理上独立的服务器共同组成的"虚拟"服务器称之为集群服务器.一项称做M ...

  5. Oracle 12.1.0.2 New Feature翻译学习【In-Memory column store内存列存储】【原创】

    翻译没有追求信达雅,不是为了学英语翻译,是为了快速了解新特性,如有语义理解错误可以指正.欢迎加微信12735770或QQ12735770探讨oracle技术问题:) In-Memory Column ...

  6. C#:结构

    1. 简单示例 // 定义结构 public struct Person { public string name; public int age; } class Program { static ...

  7. SQL周、日、月、年数据统计

    本文只是记录在项目中用到的统计的SQL语句,记一笔以防忘了 /// <summary> /// 获取统计数据 /// </summary> /// <param name ...

  8. LINUX下的PHP

    由于linux系统的稳定性,大部分的PHP服务器都被部署在linux上,而且像redis等扩展在linux能得到更好的支持,所以对于PHP程序员来说,使用linux的功底也相当重要,接下来总结一下我从 ...

  9. PostgreSQL-角色、库、模式、表

    由于不了解postgresql的psql工具,安装完数据库后就直接用pgadmin或navicat来连接操作,在确认初始化后的库中默认有些什么东西后竟然一直无处下手,在还没有了解pg大致体系的情况下搞 ...

  10. EF Load之详讲

        参考 Loading Related Entities with Entity Framework - A Beginner's Primer