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)
источник