骰子期望 拼多多[编程题](python AC解)

在这里插入图片描述
思路都写在注释里了

n = int(input())
x = input().split(' ')
res = []
maxlen = 0
for each in x:
    this_x = int(each)
    maxlen = max(maxlen,this_x)
    tempres = [(1/this_x) for _ in range(this_x)]
    res.append(tempres)
for i in range(len(res)):
    while len(res[i]) < maxlen:#假设最大的xi为maxlen,我们将每一个不到maxlen的数组都填充0到maxlen的长度
        res[i].append(0)#res[i][j]代表res[i]这个骰子,摇到j+1的概率(因为list索引从0开始)
#print(res)
p_dict = {}#max_val:p

#摇到的最大值是val的概率是
#所有都摇到[1,val]的概率(下面的p_left)-所有都摇到[1,val-1]的概率(下面的p_right)
for i in range(maxlen,0,-1):
    this_val = i
    p_left = 1
    for j in range(n):
        p_left = p_left*sum(res[j][:i])
    p_right = 1
    for j in range(n):
        p_right = p_right*sum(res[j][:i-1])
    p_dict[this_val] = p_left-p_right
res_1 = 1
#对摇到1单独处理
for j in range(n):
    res_1 = res_1 * res[j][0]
p_dict[1] = res_1
final_res = 0
for each_val in p_dict:
    final_res += p_dict[each_val]*each_val
print('%.2f'%final_res)#,res,maxlen,p_dict)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值