3.0 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5900f5021000cf542c510015 | 問題 406: 推測ゲーム | 5 | 302074 | problem-406-guessing-game |
--description--
整数の集合 {1, 2, ..., $n$} から選ばれた秘密の数を、質問をすることで当てます。 それぞれの数 (質問) で得られる回答は、次の 3 つのいずれかです。
- 「あなたの推測は秘密の数よりも小さい」(a のコストが発生する)
- 「あなたの推測は秘密の数よりも大きい」(b のコストが発生する)
- 「当たり!」 (ゲーム終了)
値 n
, a
, b
が与えられているとき、最適な戦略に従えば、起こり得る最悪のケースの総コストが最小化します。
例えば、n = 5
, a = 2
, b = 3
の場合、最初に秘密の数が "2" であるかどうかを尋ねます。
2 が秘密の数よりも大きいと告げられた場合 (コストは b = 3
)、秘密の数が "1" であることが分かります (総コストは 3)。
2 が秘密の数よりも小さいと告げられた場合 (コストは a = 2
)、次の質問は "4" です。
4 が秘密の数よりも大きいと告げられた場合 (コストは b = 3
)、秘密の数が "3" であることが分かります (総コストは 2 + 3 = \color{blue}{\mathbf{5}}
)。
4 が秘密の数よりも小さいと告げられた場合 (コスト a = 2
)、秘密の数が "5" であることが分かります (総コストは 2 + 2 = \color{blue}{\mathbf{4}}
)。
したがって、この戦略によって達成される、最悪ケースのコストは 5 です。 また、達成可能な最悪ケースのコストの中でこれが最も低いコストであることも分かっています。 つまり、与えられた値 n
, a
, b
に対してこれが最適な戦略です。
与えられた値 n
, a
, b
に対する最適な戦略によって達成される、最悪ケースのコストを C(n, a, b)
とします。
いくつかの例を次に示します。
$$\begin{align} & C(5, 2, 3) = 5 \\ & C(500, \sqrt{2}, \sqrt{3}) = 13.220\,731\,97\ldots \\ & C(20\,000, 5, 7) = 82 \\ & C(2\,000\,000, √5, √7) = 49.637\,559\,55\ldots \\ \end{align}$$
F_1 = F_2 = 1
を初期条件とするフィボナッチ数 F_k = F_{k - 1} + F_{k - 2}
を F_k
と定義します。
\displaystyle\sum_{k = 1}^{30} C({10}^{12}, \sqrt{k}, \sqrt{F_k})
を求め、四捨五入して小数第 8 位まで示しなさい。
--hints--
guessingGame()
は 36813.12757207
を返す必要があります。
assert.strictEqual(guessingGame(), 36813.12757207);
--seed--
--seed-contents--
function guessingGame() {
return true;
}
guessingGame();
--solutions--
// solution required