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
610
「銀将ご乱心」
mizti
0
970
paint.pdf
mizti
1
630
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
From π to Pie charts
rasagy
0
92
Music & Morning Musume
bryan
46
7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Leo the Paperboy
mayatellez
0
1.3k
Between Models and Reality
mayunak
0
150
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
HDC tutorial
michielstock
0
280
A Modern Web Designer's Workflow
chriscoyier
698
190k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
0
46
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
150
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 回 繰 り 返 す