Knockout - баскетбольная игра, в которой игроки по очереди стреляют. Это играется как последовательность соревнований двух игроков, каждый из которых имеет возможность «выбить» одного из этих игроков.
Предположим, что игроки имеют 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имеет 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)