博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu4550] 收集邮票
阅读量:4317 次
发布时间:2019-06-06

本文共 1316 字,大约阅读时间需要 4 分钟。

题目描述

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

现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。

输入输出格式

输入格式:

一行,一个数字N

N<=10000

输出格式:

要付出多少钱.

保留二位小数

输入输出样例

输入样例#1: 
3
输出样例#1: 
21.25

提交地址 :

题解: 简单的期望DP; 我们设f[i]表示,已经买了i张邮票,我们要买到n张,还需要买多少次; f[i] = (i / n) * f[i] + ((n - i) / n) * f[i+1] + 1,什么意思? 我们有 i/n 的可能买到已经买过的邮票, 有 (n - i) / n 的可能买到没有买过的邮票乘上相应的数量再加上用的这一次就是结果; 化简得到 : f[i] =  f[i+1] + n / (n - i); 这样f[n] = 0, 就可以递推求得f数组; 我们再设g[i], 表示我们已经买了i个邮票,我们要买到n张,还需要多少钱; g[i] = (i / n) * (g[i] + f[i]) + ((n - i) / n) * (g[i+1] + f[i+1]) + 1,什么意思? 我们有i张邮票,有 i / n 的可能买到已经买过的邮票, 有 (n - i) / n 的可能买到不一样的邮票, 乘的后面的g[i] + f[i]是什么意思? 我们买的是以前买过的,所以乘上g[i] + f[i] * 1,第二个同理;

 
Code:
1 #include 
2 #include
3 #include
4 using namespace std; 5 6 double n; 7 8 double f[10010], g[10010]; 9 10 int main()11 {12 cin >> n;13 14 for (register int i = n - 1 ; i >= 0 ; i --)15 {16 f[i] = f[i+1] + n / (n - i);17 }18 19 for (register int i = n - 1 ; i >= 0 ; i --)20 {21 g[i] = g[i+1] + f[i+1] + (i / (n - i)) * f[i] + n / (n - i);22 }23 24 printf("%.2lf", g[0]);25 return 0;26 }
 

 

 

转载于:https://www.cnblogs.com/BriMon/p/9142186.html

你可能感兴趣的文章
jdbc之二:DAO模式
查看>>
MySQL性能优化方法一:缓存参数优化
查看>>
Angular2 - 概述
查看>>
正则表达式tab表示\t
查看>>
NodeJS+Express+MongoDB 简单实现数据录入及回显展示【Study笔记】
查看>>
Highcharts使用指南
查看>>
网络基础(子网划分)
查看>>
Google C++ Style
查看>>
MyBatis总结八:缓存介绍(一级缓存,二级缓存)
查看>>
div+css教程网站建设门户网站和电子商务网站CSS样式表
查看>>
[LeetCode][JavaScript]Candy
查看>>
Mybatis分页插件
查看>>
sk_buff Structure
查看>>
oracle的级联更新、删除
查看>>
多浏览器开发需要注意的问题之一
查看>>
Maven配置
查看>>
HttpServletRequest /HttpServletResponse
查看>>
SAM4E单片机之旅——24、使用DSP库求向量数量积
查看>>
从远程库克隆库
查看>>
codeforces Unusual Product
查看>>