收集邮票C++题目【概率期望DP+数学推导】

题意

Description

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

Format

Input

一行,一个数字 n n n

Output

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

Samples

输入数据 1

3

输出数据 1

21.25

1 ≤ n ≤ 1 0 4 1\leq n\leq 10^4 1n104

思路

这一道题目堪称牛逼,需要数学功底。

P ( x , i ) P(x,i) P(x,i) 表示买 x x x 次能从 i i i 种买到 n n n 种的概率

f i f_i fi 表示现在有 i i i 张,买到 n n n 张的期望。

那么有:
f i = ∑ x = 0 ∞ x × P ( x , i ) ⇔ f i = n − i n × f i + 1 + i n × f i + 1 ⇔ n × f i = ( n − i ) × f i + 1 + i × f i + n ⇔ ( n − i ) × f i = ( n − i ) × f i + 1 + n ⇔ f i = f i + 1 + n n − i . f_i=\sum_{x=0}^\infty x\times P(x,i)\\ \begin{align} &\Leftrightarrow f_i=\frac{n-i}{n}\times f_{i +1} + \frac{i}{n}\times f_i+1\\ &\Leftrightarrow n\times f_i=(n-i)\times f_{i+1}+i\times f_i+n\\ &\Leftrightarrow (n-i)\times f_i=(n-i)\times f_{i+1}+n\\ &\Leftrightarrow f_i=f_{i+1}+\frac{n}{n-i}. \end{align} fi=x=0x×P(x,i)fi=nni×fi+1+ni×fi+1n×fi=(ni)×fi+1+i×fi+n(ni)×fi=(ni)×fi+1+nfi=fi+1+nin.
显然 f n = 0. f_n=0. fn=0.

考虑设 g i , j g_{i,j} gi,j 表示有 i i i 张,下一张是 j j j 的期望。

显然: g i , j → g i , j + 1 g_{i,j}\rightarrow g_{i,j+1} gi,jgi,j+1 的概率为 i n \frac{i}{n} ni g i , j → g i + 1 , j + 1 g_{i,j}\rightarrow g_{i+1,j+1} gi,jgi+1,j+1 的概率为 n − i n \frac{n-i}{n} nni,并且付出代价为 j . j. j.

显然有:
g i , j = i n × g i , j + 1 + n − i n × g i + 1 , j + 1 + j g_{i,j}=\frac{i}{n}\times g_{i,j+1}+\frac{n-i}{n}\times g_{i+1,j+1}+j gi,j=ni×gi,j+1+nni×gi+1,j+1+j
因为这是一个递推式,不妨考虑它的性质:
g i , j = ∑ x = 0 ∞ [ j + ( j + 1 ) + ⋯ + ( x + j − 1 ) ] × P ( x , i ) = ∑ x = 0 ∞ x × ( x + 2 × j − 1 ) 2 × P ( x , i ) \begin{align} g_{i,j}&=&&\sum_{x=0}^\infty\left[j+(j+1)+\dots+(x+j-1) \right]\times P(x,i)\\ &=&&\sum_{x=0}^\infty\frac{x\times(x+2\times j-1)}{2}\times P(x,i)\end{align} gi,j==x=0[j+(j+1)++(x+j1)]×P(x,i)x=02x×(x+2×j1)×P(x,i)
考虑与 g i , j + 1 g_{i,j+1} gi,j+1 发生联系,做差发现:
g i , j + 1 − g i , j = ∑ x = 0 ∞ x × ( x + 2 × j + 1 − x − 2 × j + 1 ) 2 × P ( x , i ) = ∑ x = 0 ∞ x × 2 2 × P ( x , i ) = f i ∴ g i , j = g i , j + 1 − f i . \begin{align}g_{i,j+1}-g_{i,j}=\sum_{x=0}^\infty\frac{x\times(x+2\times j+1 - x-2\times j+1)}{2}\times P(x,i)\\ = \sum_{x=0}^\infty \frac{x\times2}{2}\times P(x,i)= f_i\\ \therefore g_{i,j}=g_{i,j+1}-f_i. \end{align} gi,j+1gi,j=x=02x×(x+2×j+1x2×j+1)×P(x,i)=x=02x×2×P(x,i)=figi,j=gi,j+1fi.
化简该式子:
g i , j = g i , j + 1 × i n + g i + 1 , j + 1 × n − i n + j ⇔ g i , j = ( g i , j + f i ) × i n + ( g i + 1 , j + f i + 1 ) × n − i n + j ⇔ n × g i , j = i × ( g i , j + f i ) + ( g i + 1 , j + f i + 1 ) × ( n − i ) + n × j ⇔ n × g i , j = i × g i , j + i × f i + n × g i + 1 , j − i × g i + 1 , j + n × f i + 1 − i × f i + 1 + n × j ⇔ ( n − i ) × g i , j = ( n − i ) × g i + 1 , j + i × f i + ( n − i ) × f i + 1 + n × j ⇔ g i , j = g i + 1 , j + f i + 1 + i × f i + n × j n − i ⇔ g i , j = g i + 1 , j + f i + 1 + f i × i n − i + n × j n − i g_{i,j}=g_{i,j+1}\times \frac{i}{n}+g_{i+1,j+1}\times\frac{n-i}{n}+j\\ \begin{align} &\Leftrightarrow& g_{i,j}=(g_{i,j}+f_i)\times\frac{i}{n}+(g_{i+1,j}+f_{i+1})\times\frac{n-i}{n}+j\\ &\Leftrightarrow& n\times g_{i,j}=i\times(g_{i,j}+f_i)+(g_{i+1,j}+f_{i+1})\times(n-i)+n\times j\\ &\Leftrightarrow&n\times g_{i,j}=i\times g_{i,j}+i\times f_i+n\times g_{i+1,j}-i\times g_{i+1,j}+n\times f_{i+1}-i\times f_{i+1}+n\times j\\ &\Leftrightarrow& (n-i)\times g_{i,j}=(n-i)\times g_{i+1,j}+i\times f_i+(n-i)\times f_{i+1}+n\times j\\ &\Leftrightarrow& g_{i,j}=g_{i+1,j}+f_{i+1}+\frac{i\times f_i+n\times j}{n-i}\\ &\Leftrightarrow& g_{i,j}=g_{i+1,j}+f_{i+1}+f_i\times\frac{i}{n-i}+\frac{n\times j}{n-i} \end{align} gi,j=gi,j+1×ni+gi+1,j+1×nni+jgi,j=(gi,j+fi)×ni+(gi+1,j+fi+1)×nni+jn×gi,j=i×(gi,j+fi)+(gi+1,j+fi+1)×(ni)+n×jn×gi,j=i×gi,j+i×fi+n×gi+1,ji×gi+1,j+n×fi+1i×fi+1+n×j(ni)×gi,j=(ni)×gi+1,j+i×fi+(ni)×fi+1+n×jgi,j=gi+1,j+fi+1+nii×fi+n×jgi,j=gi+1,j+fi+1+fi×nii+nin×j
显然这里的 j j j 对于转移是无用的,因为我们只需要知道 j = 1 j=1 j=1 的答案,所以说我们的转移如下:
g i = g i + 1 + f i + 1 + f i × i n − i + n n − i g_{i}=g_{i+1}+f_{i+1}+f_i\times\frac{i}{n-i}+\frac{n}{n-i} gi=gi+1+fi+1+fi×nii+nin
于是我们用 O ( n + n ) O(n+n) O(n+n) 解决了这道题目。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iomanip>
#define N 10005
#define ld long double
using namespace std;
int n;
ld f[N],g[N];
int main(){cin >> n;for (int i = n - 1;i >= 0;i --) f[i] = f[i + 1] + 1.0 * n / (n - i);for (int i = n - 1;i >= 0;i --) g[i] = g[i + 1] + f[i + 1] + f[i] * 1.0 * i / (n - i) + 1.0 * n / (n - i);cout << fixed << setprecision(2) << g[0];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【elasticsearch】慢查询替代查询审计的尝试

【elasticsearch】慢查询替代查询审计的尝试 使用了es有两年了&#xff0c;突然发现一个&#xff0c;es没有查询审计日志&#xff0c;某个用户查询了某个索引的审计。 找了官方文档和社区的回复都是说使用slow log替代慢查询。 尝试一下。 参考链接1&#xff1a;https://discus…

Py深度学习基础|关于Batch Normalization

1. 为什么需要Batch Normalization 通常我们会在输入层进行数据的标准化处理&#xff0c;这是为了让模型学习到更好的特征。同样&#xff0c;在模型的中间层我们也可以进行normalize。在神经网络中, 数据分布对训练会产生影响。 比如我们使用tanh作为激活函数&#xff0c;当输入…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

MySQL中的多表查询

数据库设计范式(范例) 好的数据库设计&#xff0c;事倍功半&#xff0c;不会有歧义 第一范式&#xff1a;列保证原子性&#xff08;列不可再分解&#xff09; 联系方式&#xff1a;电话&#xff0c;微信&#xff0c;QQ&#xff0c;邮箱 这些都不可分解 第二范式&#xff1a;要…

annaconda详细解读换源文件

annaconda换源详细解读文件 annaconda换源详细解读文件 annaconda换源详细解读文件 #踩坑/annaconda换源详细解读通道问题 如何准确使用国内源高效安装GPU版本的Pytorch - 知乎 文件中的custom通道&#xff0c;需要自己手动添加到默认通道里面&#xff0c;记得后面更上/包名…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

SpringBoot:注解详解

RequestMapping 注解在类上:表示该类中所有响应请求的方法都以此地址为父路径 value&#xff08;path&#xff09; 指定请求的实际访问地址&#xff0c;默认RequestMapping(“url”)的值url即为value的值。指定的地址可以是 URI Template 模式。 method 指定请求的method类型…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

Java入门——继承和多态(上)

包 包是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过. 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如 public cla…

服装店会员管理系统结合小程序商城帮你挖掘出潜在客户

在现代社会&#xff0c;随着科技的不断进步和人们消费习惯的变化&#xff0c;传统的服装店已经不再能够满足消费者的需求。为了更好地服务客户&#xff0c;提升销售业绩&#xff0c;许多服装店开始引入会员管理系统&#xff0c;并结合小程序商城&#xff0c;实现线上线下的无缝…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;简单的模拟题&#xff0c;初始化为0&#xff0c;考虑先不浇灌每一个植物解题思路二&#xff1a;初始化为n&#xff0c;考虑每一个植物需要浇灌解题思路三&#xff1a;0 题目描述&#xff1a…

在ubuntu安装Docker容器

1、进入root用户模式 sudo -i 回车后&#xff0c;输入root的密码即可进入root模式2、在ubuntu上安装docker &#xff08;1&#xff09;直接使用 apt 安装&#xff0c;一般这样也自动启动好了 apt install docker.io3、验证安装成功&#xff0c;以及启动与校验 &#xff08;…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…

STM32F407-驱动SHT41采集温湿度

STM32F407-驱动SHT41采集温湿度 SHT41 SHT41通过I2C方式进行驱动 从机地址&#xff1a; 0x44 获取数据方式 1&#xff09;先发送I2C写&#xff0c;写入特定指令 2&#xff09;延时一段时间&#xff0c;等待SHT41处理 3&#xff09;再进行I2C读&#xff0c;读数据即可 一些…

Ansible(二)

一、Playbook基础 1.1 Playbook定义 Playbook其实是Ansible服务的一个配置文件&#xff0c;Ansible使用Playbook的YAML语言配置编写成操作需求&#xff0c;实现对远端主机或策略部署&#xff0c;实现对远端主机的控制与管理。 1.2 Playbook组成 Tasks&#xff1a;任务&…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

skynet - spinlock 简单的自旋锁

spinlock.h 代码位于&#xff1a; https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 该文件内&#xff0c;根据不同环境提供了 3 种 api 实现&#xff1a; pthread_mutex_t 系列函数gcc 内置原子操作函数std atomic 系列函数 看了下&#xff0c;效率最…

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环&#xff0c;它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险&#xff0c;还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx报错&#xff09; 本…