【AcWing】蓝桥杯集训每日一题Day29|数学期望|DP|4009.收集卡牌(C++)

4009.收集卡牌
4009. 收集卡牌 - AcWing题库
难度:困难
时/空限制:1s / 512MB
总通过数:995
总尝试数:1852
来源:

第23次CCF计算机软件能力认证
算法标签

数学期望DP状态压缩DP记忆化搜索

题目内容

小林在玩一个抽卡游戏,其中有 n 种不同的卡牌,编号为 1 到 n。
每一次抽卡,她获得第 i 种卡牌的概率为 pi。
如果这张卡牌之前已经获得过了,就会转化为一枚硬币。
可以用 k 枚硬币交换一张没有获得过的卡。
小林会一直抽卡,直至集齐了所有种类的卡牌为止,求她的期望抽卡次数。
如果你给出的答案与标准答案的绝对误差不超过  1 0 − 4 10^{-4} 104,则视为正确。
提示:聪明的小林会把硬币攒在手里,等到通过兑换就可以获得剩余所有卡牌时,一次性兑换并停止抽卡。

输入格式

输入共两行。
第一行包含两个用空格分隔的正整数 n,k,第二行给出 p1,p2,…,pn,用空格分隔。

输出格式

输出共一行,一个实数,即期望抽卡次数。

数据范围

对于 20% 的数据,保证 1≤n,k≤5。
对于另外 20% 的数据,保证所有 pi 是相等的。
对于 100% 的数据,保证 1≤n≤16,1≤k≤5,所有的 pi 满足 pi≥1/10000,且  ∑ i = 1 n \sum_{i=1}^n i=1n pi=1。
注意,本题在官网必须保留 10 位小数才能通过(可能是没加SPJ),在本网站无此问题,只要满足你给出的答案与标准答案的绝对误差不超过  1 0 − 4 10^{-4} 104,则视为正确。

输入样例1:
2 2
0.4 0.6
输出样例1:
2.52
样例1解释

共有 2 种卡牌,不妨记为 A 和 B,获得概率分别为 0.4 和 0.6,2 枚硬币可以换一张卡牌。下面给出各种可能出现的情况:

  • 第一次抽卡获得 A,第二次抽卡获得 B,抽卡结束,概率为 0.4×0.6=0.24,抽卡次数为 2。
  • 第一次抽卡获得 A,第二次抽卡获得 A,第三次抽卡获得 B,抽卡结束,概率为 0.4×0.4×0.6=0.096,抽卡次数为 3。
  • 第一次抽卡获得 A,第二次抽卡获得 A,第三次抽卡获得 A,用硬币兑换 B,抽卡结束,概率为 0.4×0.4×0.4=0.064,抽卡次数为 3。
  • 第一次抽卡获得 B,第二次抽卡获得 A,抽卡结束,概率为 0.6×0.4=0.24,抽卡次数为 2。
  • 第一次抽卡获得 B,第二次抽卡获得 B,第三次抽卡获得 A,抽卡结束,概率为 0.6×0.6×0.4=0.144,抽卡次数为 3。
  • 第一次抽卡获得 B,第二次抽卡获得 B,第三次抽卡获得 B,用硬币兑换 A,抽卡结束,概率为 0.6×0.6×0.6=0.216,抽卡次数为 3。

因此答案是 0.24×2+0.096×3+0.064×3+0.24×2+0.144×3+0.216×3=2.52

输入样例2:
4 3
0.006 0.1 0.2 0.694
输出样例2:
7.3229920752
题目解析

最后用硬币兑换没有出现过的卡牌

n表示卡牌总共的种类
k表示多少枚硬币换一张卡牌

第二行是每次抽到每张卡牌的概率

输出期望抽卡次数

非常经典的,在算法题里常见的数学期望问题‘

从数学期望的角度分析

n很小,表示状态的时候需要用状态压缩的思想

如何表示状态

假设n=5,现在的卡牌有2,4,5,硬币的数量是2
因为n很小,只有16,表示有哪些卡牌的时候,可以用一个压缩的状态,用一个5位的01串来表示,01011,分别表示这5张卡牌有没有
用第二个数表示硬币数
所以状态可以用 ( 01011 , 2 ) (01011,2) (01011,2)的二维状态来表示
写代码的时候把01串看成是二进制表示,转化成对应的十进制数来存储

从当前这个状态直到集齐所有卡牌,这个过程在概率论里面称为事件

需要找一下不同事件之间的关系

比如 ( 01011 , 2 ) (01011,2) (01011,2),可以转化成哪些事件呢
就看下一抽能抽到什么卡牌
一共有五种抽发,所以能变成五种事件,概率分别是 p 1 , p 2 , p 3 , p 4 , p 5 p_{1},p_{2},p_{3},p_{4},p_{5} p1,p2,p3,p4,p5
如果下一抽抽的是第一张卡牌的话,变成的事件分别是 X 1 , X 2 , X 3 , X 4 , X 5 X_{1},X_{2},X_{3},X_{4},X_{5} X1X2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值