P4550 收集邮票
P4550 收集邮票
题目描述
有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。
现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。
输入格式
一行,一个数字N
N<=10000
输出格式
要付出多少钱.
保留二位小数
输入输出样例
3
21.25
这一道题可咋做?
顿时懵了
我们先来想一下这个问题的简化版 由简入繁
假如一共只有1种邮票 (废话啊) 那买到的概率自然是1/1 肯定能够买到
(QAQ不就是1嘛)
假如一共只有2种邮票(事情越来越有意思了)
如果不考虑两种邮票之间的联系 买到第一种邮票的概率是1/2 第二种也是 1/2
1+{1*1/2 + 2*1/4 + 3*(1/2)^3 +...+ k*(1/2)^k} k是正无穷
化简得1+2=3
期望做法:
定义f[i]为差i种买齐时的期望票数
f[0]=0;//初始定值
ans=f[n]//答案状态
拿n=2来举例
f[1]=1/2*(f[0]+1) + 1/2 *(f[1]+1)
f[1]=2;
f[2]=2/2(f[1]+1)=3
n=3
f[1]=1/3*(f[0]+1) +2/3*(f[1]+1) =3
f[2]=2/3 * (f[1]+1) +1/3*(f[2]+1) =4.5
f[3]=3/3*(f[2]+1)=5.5
n
f[i]=i/n*(f[i-1]+1) +(n-i)/n*(f[i]-1)
一波移项得
f[i]=f[i-1]+n/i
注:以上蒟蒻的异想天开部分的f全部脑补成g
接下来上我们老师的完整推导过程:
前方高能!
n=2
1+ {1*1/2+2*(1/2)^2+3*(1/2)^3+...(k-1)*(1/2)^(k-1)+k*(1/2)^k}
{}*2={1+2*1/2+3*(1/2)^2+4*(1/2)^3+...k*(1/2)^(k-1)}
{}={}*2-{}
=1+1/2+(1/2)^2+(1/2)^3+...+(1/2)^(k-1)-k*(1/2)^k
=2-(1/2)^(k-1)-k*(1/2)^k
=2
ans=3
定义g[i]为差i种买齐时的期望
g[0]=0
n=2
g[1]=1/2*(g[0]+1)+1/2*(g[1]+1)
g[1]=g[0]+2=2
g[2]=2/2*(g[1]+1)=3
n=3
g[1]=1/3*(g[0]+1)+2/3*(g[1]+1)
g[1]=g[0]+3=3
g[2]=2/3*(g[1]+1)+1/3*(g[2]+1)
3*g[2]=2*g[1]+g[2]+3
g[2]=g[1]+1.5=4.5
g[3]=3/3*(g[2]+1)=5.5
n
g[i]=i/n*(g[i-1]+1)+(n-i)/n*(g[i]+1)
i*g[i]=i*g[i-1]+n
g[i]=g[i-1]+n/i
f[i][j]还差i种,这一次买需要j元,到买齐花费的期望
f[i][j]=i/n*(f[i-1][j+1]+j)+(n-i)/n*(f[i][j+1]+j)
买一张就涨价一元,如果之后还要买g张,那么贡献g*1元
f[i][j+1]=f[i][j]+g[i]
f[i][j]=i/n*(f[i-1][j]+g[i-1]+j)+(n-i)/n*(f[i][j]+g[i]+j)
f[i]=i/n*(f[i-1]+g[i-1]+j)+(n-i)/n*(f[i]+g[i]+j)
f[i][j]=f[i-1][j]+g[i-1]+(n-i)/i*g[i]+n*j/i
ans=f[n][1]
f[i]=f[i-1]+g[i-1]+(n-i)/i*g[i]+n/i
代码可以继续简化一些哦
#include<bits/stdc++.h>
using namespace std;
//const int maxn=10005;
//double g[maxn],f[maxn];
int main()
{
int n;
scanf("%d",&n);
// for(int i=1;i<=n;i++)
// g[i]=g[i-1]+n*1.0/i;
// for(int i=1;i<=n;i++)
// f[i]=f[i-1]+g[i-1]+(n-i)*1.0/i*g[i]+n*1.0/i;
// printf("%.2lf",f[n]);
double g=,f=;
for(int i=;i<=n;i++)
{
f=f+g+n*1.0/i;
g=g+n*1.0/i;
f=f+(n-i)*1.0/i*g;
}
printf("%.2lf",f);
return ;
}
P4550 收集邮票的更多相关文章
- P4550 收集邮票-洛谷luogu
传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢 ...
- bzoj1426 (洛谷P4550) 收集邮票——期望
题目:https://www.luogu.org/problemnew/show/P4550 推式子……:https://blog.csdn.net/pygbingshen/article/detai ...
- 洛谷P4550 收集邮票(概率期望)
传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...
- Luogu P4550 收集邮票
题目链接:Click here Solution: 本题直接推价格似乎很难,考虑先从购买次数入手 设购买次数\(g(i)\)为当前有\(i\)种不同的邮票,要买到\(n\)种的期望购买次数 可以由期望 ...
- P4550 收集邮票 与 灵异的期望
考前复习一下期望相关知识,这题的期望还是很巧妙的. 设 \(f_{i}\) 表示已经买到了 \(i\) 张不同的邮票的期望步数,\(g_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票的期望花 ...
- [洛谷P4550]收集邮票
题目大意:有$n(n\leqslant10^4)$个物品,第$i$次会从这$n$个物品中随机获得一个,并付出$i$的代价,问获得所有的$n$个物品的代价的期望. 题解:令$f_i$表示现在已经获得了$ ...
- [P4550] 收集邮票 - 概率期望,dp
套路性地倒过来考虑,设\(f[i]\)表示拥有了\(i\)种票子时还需要多少次购买,\(g[i]\)表示还需要多少钱 推\(g[i]\)递推式时注意把代价倒过来(反正总数一定,从顺序第\(1\)张开始 ...
- 【BZOJ-1426】收集邮票 概率与期望DP
1426: 收集邮票 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 261 Solved: 209[Submit][Status][Discuss] ...
- 【BZOJ1426】收集邮票 期望
[BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...
随机推荐
- codeforces 609C
#include<bits/stdc++.h> using namespace std; ],c[]; int main() { int n,i; while(cin >> n ...
- HDU 3397"Sequence operation"(线段树区间和并)
传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...
- P1031 栈的序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- Linux 内核kobject 层次, kset, 和子系统
kobject 结构常常用来连接对象到一个层级的结构中, 匹配正被建模的子系统的结构. 有 2 个分开的机制对于这个连接: parent 指针和 ksets. 在结构 kobject 中的 paren ...
- 关于redux和react-redux使用combinereducers之后的问题
最近用react写项目的时候,开始复习之前学过的redux,记录一下一些坑,以防忘记 我现在的redux目录下有这么些东西 首先是index.js import { createStore } fro ...
- C++,Windows/MFC_中L和_T()之区别
字符串前面加L表示该字符串是Unicode字符串._T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变.因此,Visual C++里边定 ...
- Visio图像应用
图像插入: 直接搜索然后插入 CAD是工程绘图. CAD属性设置框 下面是图像编辑: 通过格式中的旋转进行调整 但是CAD格式的图没有格式 图片可以设置题注 图片层次的使用 CAD图片颜色的修改在 图 ...
- python常见关键字的使用
常见关键字 在循环中常见的关键字使用方法 continue:结束本次循环,继续执行下一次循环 break:跳出一个循环或者结束一个循环 例 使用用户名密码登录(有三次机会)count=0while c ...
- 大数据基石——Hadoop与MapReduce
本文始发于个人公众号:TechFlow 近两年AI成了最火热领域的代名词,各大高校纷纷推出了人工智能专业.但其实,人工智能也好,还是前两年的深度学习或者是机器学习也罢,都离不开底层的数据支持.对于动辄 ...
- JMM中的Happens-Before原则
在java内存模型中,happens-before应该理解为:前一个操作的结果,可以被后续的操作获取,即内存可见性. 为了解决多线程的内存可见性问题,就提出了happens-before原则, ...