freeCodeCamp/curriculum/challenges/japanese/10-coding-interview-prep/project-euler/problem-328-lowest-cost-sea...

57 lines
3.3 KiB
Markdown
Raw Normal View History

---
id: 5900f4b41000cf542c50ffc7
title: '問題 328: 最低コストを探す'
challengeType: 5
forumTopicId: 301985
dashedName: problem-328-lowest-cost-search
---
# --description--
整数 {1, 2, ..., $n$} から選ばれた秘密の数を、質問をすることで当てます。 それぞれの数 (質問) を尋ねるとき、<u>尋ねた数と同じだけのコスト</u>がかかり、得られる答えは次の 3 つのいずれかです。
- 「あなたの推測は秘密の数よりも小さい」
- 「当たり!」
- 「あなたの推測は秘密の数よりも大きい」
値 $n$ が与えられているとき、最適な戦略に従えば、<u>起こり得る最悪のケース</u>の総コスト (すなわち、尋ねた質問の総和) が最小化します。 次に例を示します。
$n = 3$ の場合、一番良いのはもちろん、秘密の数が "<strong>2</strong>" であるかどうかを尋ねることです。 答えを聞けば、すぐに秘密の数が分かります (総コスト = 2)。
$n = 8$ の場合は「二分探索」型の戦略が良いかもしれません。まず "<strong>4</strong>" を尋ね、秘密の数が 4 より大きければ、さらに 1 回か 2 回尋ねる必要があります。 2 回目は "<strong>6</strong>" を尋ねます。 秘密の数が 6 よりさらに大きければ、7 か 8 かを知るために 3 回目の質問が必要です。 したがって、3 回目の質問は "<strong>7</strong>" であり、この最悪ケースの総コストは $4 + 6 + 7 = \mathbf{\color{red}{17}}$です。
1 回目の質問で "<strong>5</strong>" を尋ねれば、$n=8$ に対する最悪ケースのコストを大幅に下げることができます。 秘密の数が 5 よりも大きいと言われた場合、2 回目の質問は「<strong>7</strong>」となり、秘密の数がどれなのかを確実に知ることができます (総コスト $5 + 7 = \mathbf{\color{blue}{12}}$)。 秘密の数が 5 よりも小きいと言われた場合、2 回目の質問は「<strong>3</strong>」となり、秘密の数が 3 より小さければ、3 回目の質問は "<strong>1</strong>" であり、総コストは $5 + 3 + 1 = \mathbf{\color{blue}{9}}$ です。 $\mathbf{\color{blue}{12 > 9}}$ なので、この戦略における最悪ケースのコストは <strong><span style="color: red;">12</span></strong> です。 これは、先ほどの「二分探索」戦略の結果よりも優れています。また、他のどの戦略よりも優れているか、少なくとも同等です。 さて、ここまで $n = 8$ の最適な戦略を説明してきました。
上のとおり、$n$ に対する最適な戦略によって達成される、最悪ケースのコストを $C(n)$ とします。 したがって、$C(1) = 0$, $C(2) = 1$, $C(3) = 2$, $C(8) = 12$ です。
同様に、$C(100) = 400$, $\displaystyle\sum_{n = 1}^{100} C(n) = 17575$ です。
$\displaystyle\sum_{n = 1}^{200\\,000} C(n)$ を求めなさい。
# --hints--
`lowestCostSearch()``260511850222` を返す必要があります。
```js
assert.strictEqual(lowestCostSearch(), 260511850222);
```
# --seed--
## --seed-contents--
```js
function lowestCostSearch() {
return true;
}
lowestCostSearch();
```
# --solutions--
```js
// solution required
```