淘汰赛是一种篮球比赛,球员轮流投篮。它按两人比赛的顺序进行,每场比赛都有可能“淘汰”其中一名球员。
假设球员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。设pA获胜的概率。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)