解法
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∣{vi∣vi≥E[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]=vi≥E[i+1]∑N1vi+(1−p)E[i+1]
其中, E [ K + 1 ] = ∑ v i v i N E[K+1] = \frac{\sum_{v_i}v_i}{N} E[K+1]=N∑vivi
#!/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)