淘汰赛是一种篮球比赛,球员轮流投篮。它按两人比赛的顺序进行,每场比赛都有可能“淘汰”其中一名球员。
假设球员A B C D
和他们的投篮机会和制造篮筐的机会0.1 0.2 0.3 0.4
分别与比赛中的其他球员无关。两位选手在该行的前面,A
而B
“战斗”。由于A
先行,他是后卫,在被淘汰出局的危险,并且B
是攻击者,而不是立即消除危险。A
首先射击。如果成功A
,则A
已经成功防御,并前进到了队伍的后部。该行将更改为B C D A
。如果A
没有成功,则B
射击。如果B
成功,则出线A
并B
转到行尾,因此行变为C D B
。如果两者都不A
如果没有B
成功,则重复此过程,并A
再次射击,直到A
或B
做出一个篮子。
假设线路更改为B C D A
(A
已成功防御)。现在,B
与C
“战斗”B
作为后卫,并且C
是攻击者。重复此过程,直到只剩下一个人为止。那个人是赢家。
您的任务是计算每个人赢得一篮子机会的获胜概率。
输入:
数字列表,例如0.1 0.2
或0.5 0.5 0.5 0.5
,其中第n个数字是第n个个玩家上篮。您可以采用任意格式的输入,包括作为函数的参数。
输出量:
数字列表,其中第n个数字是第n个玩家赢得比赛的机会。您的数字至少在90%的时间内必须精确到至少两位小数。这意味着您可以使用基于仿真的方法。但是,如果您的代码不是基于仿真的(可以保证返回正确的答案至少到小数点后6位),那么您的分数将减少30%。
之间的示例0.5 0.5
:呼叫玩家A
和B
。设p
A获胜的概率。A
拥有2/3
的成功卫冕的机会(因为有一个1/2
机会A
得分,一个1/4
机会,A
命中和B
得分和1/4
机会都错过并重复上述过程)。如果A
未能防守,他将被淘汰并B
获胜。如果A
防御,则该行变为B A
。由于情况是对称的,因此A
获胜的概率为(1 - p)
。我们得到:
p = 2/3 * (1 - p) + 1/3 * 0
。解决,我们得到p = 2/5
。输出应为2/5 3/5
或0.4 0.6
。
我没有足够的机率做更复杂的例子。
如果您需要更多的测试用例,请参考以下几个示例:
0.1 0.2 0.3 0.4 --> 0.01 0.12 0.25 0.62
0.99 0.99 --> 0.5 0.5 (it's not exact, but if you round to two decimal places, you get 0.5 and 0.5)