BZOJ 1426 浅谈手推期望转移方程

9 篇文章 0 订阅

这里写图片描述
世界真的很大
啥也别说了,这道题真让我做我大概永远搞不出来
先贴两篇题解
题解1
题解2就是黄学长了,百度首页就不用贴了吧233
期望线性性可以有很多分解方法,考虑手推之后选择递推最好写的那一种
对于极限值求解有了新的认识,感觉很难得方程认真手推的话也用不了多久,这样
很多时候感性理解比理性分析来的容易却不深刻
看题先:
description

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

input

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

output

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

题解都有了我就大概谈一下自己的理解了
首先考虑化简问题,每张邮票都只需要1元钱,期望的花费?其实这就等价于期望的买邮票次数
f[i]表示当前有i张邮票,要集齐n种邮票的期望花费.
(由于是看得题解所以我也没法分析是怎么想到这个的了。。)
先给出一个方程:
f[i]=i/n*f[i]+(n-i)/n*f[i+1]+1
题解1里面极限值的思想可以用,大概是把f[i]弄成这个样子:
这里写图片描述
(这里g[i]就是f[i])
这个方程是很好懂的,就是期望的定义,累加买票次数*买到票的可能性,由于可能买到同样的票所以要累加到正无穷。关于正无穷之类的极限值,我们通常用错位相减的数学方法解决,手推一下正好就是原式化简
感性理解一下就是说买1张票,i/n的概率买到的票已经有了,就白买了,(n-I)/n的概率买到一张没有的票,已经有的票的种类就变成了i+1,所以还期望有f(i+1)次购买,再加上这次的购买1
然后想办法由f(i)推得答案
定义g[i]表示当前有i张邮票,要集齐n种邮票的期望花费?
考虑由于买票本身是随机的,所以先买哪张,后买哪张,是无关紧要的,不妨设的最后一张邮票的花费为1,倒数第k张的花费为k。
得到方程:
g[i]=i/n*(g[i]+f[i]+1)+(n-i)/n*(g[i+1]+f[i+1]+1)
大概意思和f一样,分为买到了和没买到,由于我们假设是从大到小的顺序买的,g[i]比g[i+1]少买一张,相当于就是g[i+1]还需要买的所有卡的数量全部加上1,相当于往后退一位,再补上第一个1,而全部+1的期望值等价于次数,等价于f数组
整理一下就可以递推了
完整代码:

#include<stdio.h>
double n,f[100010],g[100010];
int main()
{
    scanf("%lf",&n);
    for(int i=n-1;i>=0;i--)
        f[i]=f[i+1]+n/(n-i);
    for(int i=n-1;i>=0;i--)
        g[i]=g[i+1]+f[i+1]+1+i/(n-i)*(1+f[i]);
    printf("%0.2lf\n",g[0]);
    return 0;
}
/*
Whoso pulleth out this sword from this stone and anvil is duly born King of all England
*/

嗯,就是这样

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值