ノックアウトは、プレーヤーが交代で撃つバスケットボールゲームです。それは、2人のプレーヤーのコンテストのシーケンスとして再生されます。各コンテストは、それらのプレーヤーの1人を「ノックアウト」する可能性があります。
プレーヤーがそうでA B C Dあり、射撃とバスケットを作るチャンスが0.1 0.2 0.3 0.4それぞれ、コンテストの他のプレーヤーとは無関係であると仮定します。最前線にいる2人の選手、AそしてB「ファイト」。以来A最初に行く、彼はディフェンダーに排除される危険で、そしてBある攻撃者の即時撤廃の危険にさらされていない、と。A最初に撃つ。成功した場合Aは、A防御に成功し、列の最後に移動します。行はに変わりB C D Aます。Aうまくいかない場合は、B発砲します。作成した場合B、A外に出Bて行の後ろに移動するので、行はになりC D Bます。どちらでもない場合ABして、それ、プロセスの繰り返しを作る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%の確率で小数点第2位まで正確でなければなりません。つまり、シミュレーションベースのアプローチを使用できます。ただし、コードがシミュレーションベースではない場合(少なくとも小数点以下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)