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
600
CutSticks.pdf
mizti
April 07, 2013
Tweet
Share
More Decks by mizti
See All by mizti
Maze Maker
mizti
0
580
「銀将ご乱心」
mizti
0
880
paint.pdf
mizti
1
600
kaibun.pdf
mizti
0
610
dfs1.pdf
mizti
0
580
問題1. 解答例
mizti
0
480
2012/11/16 問題1
mizti
0
530
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
165
13k
Atom: Resistance is Futile
akmur
260
25k
Building an army of robots
kneath
300
41k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
Documentation Writing (for coders)
carmenintech
61
4k
Designing Experiences People Love
moore
136
23k
Fontdeck: Realign not Redesign
paulrobertlloyd
76
4.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
[RailsConf 2023] Rails as a piece of cake
palkan
28
4k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
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 回 繰 り 返 す