这是昨天在面试街上完成的编程竞赛中的一个问题:
爱丽丝和鲍勃玩游戏。第i轮(i> = 1)的操作如下:考虑到k和投掷结果的可能性(p),你的程序应该找到Alice支付Bob的预期数量,以及预期的轮数。
输入
第一行输入包含多个测试用例(T <= 50)。每个 接下来的T行包含由单个空格分隔的p和k。 p是一个 十进制数,小数点后最多两位数 0.6 <= p <= 1.k是正整数,使得0
输出
对于每个测试用例,打印两个整数。第一个数字是 整数部分预期的游戏轮数,第二轮 number是预期Alice数量的整数部分 支付鲍勃。
示例输入
3
0.6 1
1 20
0.80 8
示例输出
1 3
20 400
24 976
我已经解决了问题的第一部分,即预期的游戏轮数。我用以下代码获得了它
if __name__ == '__main__':
t = int(raw_input())
while t :
t -= 1
temp = str(raw_input())
p,k = temp.split(' ')
p = float(p)
k = int(k)
#print p,k
ans = 0.0
num = k * (p**k)
den = 1
q = 1.0 - p
for N in range(1,k+1):
den = den - ((p**(N-1))*q)
num = num + (N*(p**(N-1))*q)
#print (N*(q**N))
print int(num/den)
但问题的第二部分仍然令我感到困惑,即爱丽丝付出的预期美元数量。如何计算预期收益?
答案 0 :(得分:3)
即使您知道预期的轮数,您也需要对所有可能的支出进行平均而不是它们发生的概率。这意味着它比在预期的停止时间计算支出更复杂。以下是细节:
回想一下,期望的技术定义说如果X是随机变量,那么X的期望值是X(w)* Pr(w)的所有可能结果w的总和。如果X取正整数值,我们可以将其改为,因为X的期望值是i = 1到i * Pr(X = i)的无穷大之和。在你的情况下,我们处理的随机变量是T =游戏停止的时间,P =支付。
预期的轮数是T的期望,T是从i = 1到i * Pr(T = i)的无穷大的总和。由于它们只询问期望的整数部分,所以一旦i * Pr(T = i)小于1/2 ^ i,我们就可以停止求和。 (当i * Pr(T = i)<1/2 ^ i时,停止求和的想法是1/2 ^ i总和为1,但你可能需要调整它以避免低估。)
P的期望稍微复杂一些。如果游戏持续j轮,那么支付将是从i = 1到j为2i-1的总和,结果是j ^ 2。因此,仅可以发生形式j ^ 2的支付,并且Pr(P = j ^ 2)= Pr(T = j)。因此,P的期望值是从i = 1到无穷大i ^ 2 * Pr(P = i ^ 2)的和,其等于从i = 1到无穷大i ^ 2 * Pr的总和(T =一世)。同样,一旦i ^ 2 * Pr(T = i)小于1/2 ^ i,我们就可以停止求和。