コミック:面白い卵投げの問題
上の「プログラマーXiaohui」をクリックし、公式アカウントをフォローして、
興味深く有意義な記事をできるだけ早く配信することを選択してください。
- - - 次の日 - - -
トピック:卵を投げる問題
卵の硬さをテストするために100階から投げ落とされた2つの卵があります。たとえば、卵が9層で壊れていないが、10層で壊れている場合、卵が壊れない臨界点は9層です。
質問:最小の試行回数を使用して、卵が壊れない臨界点をテストするにはどうすればよいですか?
たとえば、最も愚かなテスト方法は何ですか?
最初の層から卵の1つを投げます。
第1層で壊れていない場合は、第2層に変更して投げ
ます。第2層で壊れていない場合は、第3層に切り替えて投げます。
……
第59層が壊れていない場合は、第60層に切り替えて投げ
ます。 60階が壊れているので、壊れないためのポイントは59階です。
最悪の場合、この方法では100回のスローが必要です。
方法1:二分法
バイナリ検索と同様の方法で、床の半分(50階)から卵を投げます。
最初の卵が50層で壊れた場合、2番目の卵は最初の層から層ごとに成長して49番目の層まで投げられます。
最初の卵が50階で壊れていない場合は、引き続き二分法を使用して、残りの半分の階(75階)に投げます...
最悪の場合、この方法を50回試す必要があります。
方法2:スクエアルート法
最初の卵と2番目の卵の試行回数をできるだけバランスさせるにはどうすればよいですか?
非常に簡単です。平方根演算を実行します。100の平方根は10です。
そのため、10階に1回、1回目は10階から、2回目は20階から、3回目は30階から…100階まで投げるようにしています。
このような最良のケースは10階で破られ、試行回数は1 + 9 = 10回です。
最悪のケースは100階で破られ、試行回数は10 + 9 = 19回です。
ただし、ここには小さな最適化ポイントがあります。15階から投げ始め、25階と35階から... 95階まで投げることができます。
この場合、最悪のケースは95階で発生し、試行回数は9 + 9 = 18回になります。
————————————
最適な試行回数がx回であるとすると、最初のスローでx番目のレイヤーを選択する必要があるのはなぜですか?
ここでの説明は少し頭が痛くなるので、座って気をつけてください。
最初にx + 1番目のレイヤーにスローされたと
します。最初の卵が壊れた場合、2番目の卵は最初のレイヤーからx番目のレイヤーまでレイヤーごとにのみスローできます。
このように、合計x + 1回試行しましたが、これはx回試行したという仮定とは逆です。初めて投げられる床はx + 1床より小さくなければならないことがわかります。
最初がx-1層に投げられたと仮定します。最初の
卵が壊れた場合、2番目の卵は最初の層から層ごとにのみ投げられ、x-2層に続きます。
このように、合計でx-2 + 1 = x-1回試行しました。仮定の数を超えることはありませんでしたが、少し保守的すぎるように見えました。
初めてx番目のレイヤーに投げられたとしましょ
う。最初の卵が壊れた場合、2番目の卵は最初のレイヤーからレイヤーごとにのみ投げられ、x-1番目のレイヤーに続きます。
このようにして、合計でx-1 + 1 = x回試行しましたが、これはたまたま仮定の数を超えていませんでした。
したがって、フロアスパンをできるだけ大きくし、試行回数xを超えないようにする場合は、最初の卵投げの最良の選択はx階です。
方法3:方程式を解く方法
x +(x-1)+(x-2)+ ... + 1 = 100
この方程式を理解するのは難しくありません。
左側の多項式は、各卵投げのフロアスパンの合計です。x回試行すると想定されているため、この多項式には合計x個の項があります。
右側は100階の総数です。
以下のこの方程式を解いてみましょう。
x +(x-1)+(x-2)+ ... + 1 = 100はに変換されます
(x + 1)* x / 2 = 100
最後に、xは切り上げられてx = 14になります
したがって、最悪の場合の最適解の試行回数は14回であり、最初の卵が投げられる階も14階です。
最後に、最初の卵が壊れていないときに試行されたフロアの数を列挙しましょう。
14、27、39、50、60、69、77、84、90、95、99、100
栗の検証を行います。
卵が折れない臨界点が65階の場合、最初の卵が投げられる階は14、27、50、60、69です。この時、あっという間に壊れました。
2番目の卵は、レイヤー61、61、62、63、64、65、66から始まり、スナップで壊れました。
したがって、破壊されない65層の臨界点が得られ、試行の総数は6 + 6 = 12 <14になります。
いくつかの追加:
1. Xiao Huiの次の号では、動的プログラミングを使用して卵を投げる問題の一般的な解決策を見つける方法について説明します。動的プログラミングについてあまり詳しくない友人は、XiaoHuiの以前のコミックプレビューを読むことができます。
コミック:動的プログラミングとは何ですか?(統合バージョン)
2.この漫画は純粋な娯楽です。現在の作品を可能な限り大切にし、XiaoHuiの行動を模倣しないでください。
- - -終わり - - -
この記事が気に入った友達は、写真を長押ししてサブスクリプションアカウントプログラマーのXiaohuiをフォローし、よりエキサイティングなコンテンツをご覧ください。