Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CutSticks.pdf
Search
mizti
April 07, 2013
0
640
CutSticks.pdf
mizti
April 07, 2013
Tweet
Share
More Decks by mizti
See All by mizti
Maze Maker
mizti
0
600
「銀将ご乱心」
mizti
0
970
paint.pdf
mizti
1
620
kaibun.pdf
mizti
0
640
dfs1.pdf
mizti
0
600
問題1. 解答例
mizti
0
500
2012/11/16 問題1
mizti
0
540
Featured
See All Featured
Speed Design
sergeychernyshev
32
1.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
3k
BBQ
matthewcrist
89
9.8k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Automating Front-end Workflow
addyosmani
1370
200k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Code Review Best Practice
trishagee
71
19k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
The Invisible Side of Design
smashingmag
301
51k
Transcript
少林寺秘棍房 弟子のたかしくん
問題 ここは中国・少林寺。 少林寺には35房あり、最初の10房は腕、手首、目、頭といった身体を鍛 える基礎訓練。続く房では、刀術、棒術、拳法という戦闘技術を学ぶ。各 房では35種の想像を絶する厳しい訓練が行われているという 。 たかしくんは35房のひとつ、秘棍房で棍術を習得しようと修行に励んで います。
問題 毎日の激しい訓練の途中で棍が折れてしまうため、 棍術の訓練に使うための棒を朝に山から切り出しています。 しかし、自然の木なので長さがまちまちです。
問題 たかしくんはこの棒を適当に切って練習用の棍を用意する役目を 持っています。 棍の数は人数より少なくても構いませんが、人数より多いことは(もったいな いので)許されません。 棍が割り当てられなかった弟子は棍をもたずに受け身の訓練です。 長さがまちまちですが武侠たるものそれも修行のうちです。 でき上がった棒は、偉い弟子から順番に長いものをとっていきます。 たかしくんは棍をつかった訓練が好きなので、できるだけ長い棍が手に入る ようにしたいと思っています。
たかし
問題 • 入力: int sticks[], int CutTimes, int Rank •
たかしくんはn本の棒を与えられ、 それぞれの棒の長さはsticks[]で表されます。 • たかしくんはCutTimes回以下の任意の回数だけ 以下を繰り返します – 任意の棒を一本選びます – その棒を2つに切断します (小数長さになることもあります) • 例: sticks [3, 4, 5] から2番目の棒を取り出して 1と3の長さに切り分けます [3, 4, 5] -> [3, 1, 3, 5] TopCoder SRM481 Div2 Level3より改題 CutTimes < 109 Rank < 109 (ただし最終的な棒の数を超えない) sticksの要素数 < 50 各stickの長さ < 109 条件:
問題 棒の切断方法はたかしくんの自由です。 たかしくんがもらえる最も長い棒の長さを求めま しょう。 •上記を繰り返したあと、棒を長いほうから順に並べ、 Rank番目の長さの棒を取得します 5 3 3 1
たかし たかしくんが 序列三位の弟子の場合 CutTimes < 109 Rank < 109 (ただし最終的な棒の数を超えない) sticksの要素数 < 50 各stickの長さ < 109 条件:
サンプル入出力 sticks={5,8} CutTimes=1 Rank=1 => 8.0 sticks={5,8} CutTimes=1 Rank=2 =>
5.0 sticks={5,8} CutTimes=1 Rank=3 => 4.0 sticks={1000000000, 1000000000, 1} CutTimes=2 Rank=5 => 1.0 sticks={ 76,594,17,6984,26,57,9, 876,5816,73,969,527,49 } CutTimes=789 Rank=459 => 34.92 出力は小数点以下2桁まであってればOK
解答例 • あくまで一例です: 問題を読み替えると解きやすくなります – 適切な切り方でRank番目の最大の長さを求めよ – 長さXの棒をRank本作ることができる 最大のXを求めよ
解答例 ある長さxで sticksからxより 長い棒を Rank本以上作 れるかどうか パーツ1: • sticks内にx以上の長さの ものがRank本以上ある?
ある ない まだ切る回 数はある? ない 長さxでRank本 以上作れる! 長さxではRank 本作れない! ある 切る回数を1減らし て、2 * xより長い棒 からxを切り出せ る? 切り 出せる 切り出 せない ※上記はCut数ベースで回していますが、本数ベースで「この棒からxはいくつ切り出 せるか」カウントしていったほうが良いかもしれません
解答例 広い範囲から特定のXの値を求める! 二分探索を使おう! というわけで、0 ~ 10^9の範囲で二分探索して Xを求めることに 100回もやれば0 ~ 10^9でも十分に正確に値を
決められる パーツ2:
解答例 パーツ1とパーツ2を組み合わせる: 0 と 10億の中間 (=5億)をxとして ある長さxでsticksからxより長い棒を Rank本以上作れるかどうか 作れる! 作れない!
限界は5億より大きい! もっと大きく5億と10億の 中間(=7.5億)をxとして ある長さxでsticksからxより長い棒を Rank本以上作れるかどうか 限界は5億より小さい! もっと小さく0と5億の 中間(=2.5億)をxとして ある長さxでsticksからxより長い棒を Rank本以上作れるかどうか 作れる! 作れない! 作れる! 作れない! 1 0 0 回 繰 り 返 す