Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
CutSticks.pdf
Search
mizti
April 07, 2013
660
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CutSticks.pdf
mizti
April 07, 2013
More Decks by mizti
See All by mizti
Maze Maker
mizti
0
630
「銀将ご乱心」
mizti
0
990
paint.pdf
mizti
1
640
kaibun.pdf
mizti
0
660
dfs1.pdf
mizti
0
610
問題1. 解答例
mizti
0
510
2012/11/16 問題1
mizti
0
550
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
Designing Experiences People Love
moore
143
24k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Fireside Chat
paigeccino
42
4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Product Roadmaps are Hard
iamctodd
55
13k
Navigating Weather and Climate Data
rabernat
0
510
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
680
GitHub's CSS Performance
jonrohan
1033
470k
It's Worth the Effort
3n
188
29k
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 回 繰 り 返 す