【Kickstart】2018 Round A - Lucky Dip

本文深入探讨了动态规划(DP)算法的子问题划分及递推公式的建立,通过实例讲解了如何运用DP策略解决复杂问题,包括概率计算与期望值求解。文章提供了Python实现代码,展示了如何通过递归和迭代计算最优解。
摘要由CSDN通过智能技术生成

解法

DP,子问题划分如下:
i次取完之后,假如想放弃,那么共计已经放弃i次,剩下的过程就是最多只能放弃K-i次的期望

所以策略很简单:

  • i次取出来的值,如果大于等于以后的期望(发生这个事件的概率为 p = ∣ { v i ∣ v i ≥ E [ i + 1 ] } ∣ N p = \frac{|\{v_i|v_i\ge E[i+1]\}|}{N} p=N{viviE[i+1]}),就取,不然就放弃。
    得到递推公式如下:
    E [ i ] = ∑ v i ≥ E [ i + 1 ] 1 N v i + ( 1 − p ) E [ i + 1 ] E[i] = \sum_{v_i\ge E[i+1]}{\frac{1}{N}v_i}+(1-p)E[i+1] E[i]=viE[i+1]N1vi+(1p)E[i+1]
    其中, E [ K + 1 ] = ∑ v i v i N E[K+1] = \frac{\sum_{v_i}v_i}{N} E[K+1]=Nvivi
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bisect import bisect_left
t = input()
for _ in xrange(t):
    n,k = map(int,raw_input().split())
    v = map(int, raw_input().split())
    v.sort()
    p = [0]
    for i in xrange(n-1,-1,-1):
        p.append(p[-1]+v[i])
    p = p[::-1]
    # print v,p
    E = 1.0*p[0]/n
    for i in xrange(k):
        j = bisect_left(v, E)
        E = 1.0*p[j]/n + 1.0*j/n*E
    print "Case #%d: %.6f" % (_+1, E)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值