P4550 收集邮票

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

3
输出 #1复制

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 收集邮票的更多相关文章

  1. P4550 收集邮票-洛谷luogu

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

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

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

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

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

  4. Luogu P4550 收集邮票

    题目链接:Click here Solution: 本题直接推价格似乎很难,考虑先从购买次数入手 设购买次数\(g(i)\)为当前有\(i\)种不同的邮票,要买到\(n\)种的期望购买次数 可以由期望 ...

  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. POJ 2488 深搜dfs、

    题意:模拟国际象棋中马的走棋方式,其实和中国象棋的马走的方式其实是一样的,马可以从给定的方格棋盘中任意点开始,问是否能遍历全部格子,能的话输出字典序最小的走棋方式,否则输出impossible 思路: ...

  2. solaris 10 基本使用

    1. 新增用户 注释掉home行# cat /etc/auto_master # # Copyright 2003 Sun Microsystems, Inc. All rights reserved ...

  3. java 集合类 & 容器

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...

  4. codeforce 381 div2

    ---恢复内容开始--- C: 由mex函数性质可知 ,对任意一个区间,都需要从0开始依次填1,2直到填满,那么,所有区间最小mex的最大值取决于最短区间长度k. 构造a数组之需要从0-k-1依次填数 ...

  5. WPF 从零开始开发 dotnet Remoting 程序

    本文告诉大家如何不使用框架,从零开始开发一个 dotnet remoting 程序 在我的另一篇博客 WPF 使用RPC调用其他进程 就大概告诉了大家如何在 WPF 使用 dotnet remotin ...

  6. SVG基础绘图实例

    SVG可缩放矢量图(Scalable Vector Graphics),是使用 XML 来描述二维图形和绘图程序的语言,图像在放大或改变尺寸的情况下其图形质量不会有所损失,是万维网联盟的标准. 下面整 ...

  7. Date日期时间相关

    最近在封装一个关于时间函数的功能时,竟发现这些最基本的函数都有些生疏,于是进来来总结复习下,巩固自己记忆的同时,希望能帮助到需要的人 首先了解下日期对象相关的方法 var date = new Dat ...

  8. quartz关闭DBUG日志

    引用了Quartz组件后,打印日志时,整天都有相应的调试信息打印出来,严重影响了查找日志效率,谷歌一番后,修改nlog配置文件即可 <?xml version="1.0" e ...

  9. HDU 2068 RPG错排 [错排公式]

    1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: ...

  10. c++ 知道旋转前后矩阵向量值 求旋转矩阵c++/c#代码 知道两个向量求他们的旋转矩阵

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12115244.html 知道旋转前后矩阵向量值 如何去求旋转矩阵R 的c++/c#代码??? ...