python做题记录之那些年我们集过的卡片

题目描述:
不知道大家的童年有没有过和我相似的经历。我记得小时候经常买干脆面,不为别的,只是因为里面有一张人物卡片。 其实有很多这样的活动都有一个相同的模式:N 种人物卡片,每次买一包干脆面随机得到一张。当你集齐这 N 种人物时,就会有相应的奖励。 那时候还不懂怎么计算概率,白白给人家送了好多钱,吃了好多干脆面。 现在的任务是,给你一个正整数 N (1 <= N <= 10^4),请你帮我从期望的角度计算平均需要买多少包干脆面才能集齐这 N 种人物。 提醒:由于结果可能不是整数,所以结果只保留到小数点后两位。
示例:
输入:N = 1

输出:1.00

当卡片为1张时,一定获奖,总共需要1包
当卡片为2张时,第一张一定可以入手,第二张有50%的几率(现实中肯定不是)可以获得没有的卡片,所以期望值就是买2包才能买到,总共需要1+2=3包
当卡片为3张时,第一次一定入手,第二张时有2/3的几率可以拿到,所以期望值是需要买3/2包才能入手,最后一张是1/3的几率可以拿到,所以期望值需要3包,总共需要1+3/2+3=5.5包
到了这里,我们可以发现规律
拿三张为例
第一次概率为3/3,第二次为2/3,第三次为1/3,概率逐级递减,需要买的包数为1,3/2,3,期望值就是概率的倒数,所以总期望值就可以用循环递减来加了,代码如下

res=0
for i in range(N,0,-1):
    res+=(N*1.0)/i
print('%.2f'%res)

猜你喜欢

转载自blog.csdn.net/qq_53029299/article/details/114375666