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
数列をプレゼントに / yukicoder-no-332
Search
camypaper
November 07, 2017
170
0
Share
数列をプレゼントに / yukicoder-no-332
camypaper
November 07, 2017
More Decks by camypaper
See All by camypaper
門松と魔法(2) 解説 / yukicoder-no-284
camypaper
0
140
DSU on Tree
camypaper
0
4.5k
部分永続 Union Find / persistent_dsu
camypaper
1
3.7k
五輪ピック / yukicoder-no-408
camypaper
0
250
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
420
How to Talk to Developers About Accessibility
jct
2
170
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
250
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Thoughts on Productivity
jonyablonski
76
5.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
ラッコキーワード サービス紹介資料
rakko
1
3M
Mobile First: as difficult as doing things right
swwweet
225
10k
The Limits of Empathy - UXLibs8
cassininazir
1
290
The untapped power of vector embeddings
frankvandijk
2
1.7k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.3k
Transcript
No. 332 数列をプレゼントに 原案,解説: camypaper
問題概要 • N 個の自然数からなる数列 A に総和が X であるような 部分列が存在するか判定せよ •
存在するならば部分列の一例を示せ • 制約 – 1 ≦ N ≦ 100 – 1 ≦ Ai ≦ 109 – Π Ai ≦10100 – 1 ≦ X ≦ 1012
考察 • これは経路復元つきのナップサック問題 • 典型的な解法は以下の 2 種類 – O(2N) で全探索
• N は最大で100なので間に合わない – 動的計画法を用いて O(NΣAi ) で解く • 最大で Σ Ai は109 以上になりうるのでやはり間に合わない • なんらかの制約や性質を利用する必要がある
怪しい制約 Π Ai ≦10100
考察 • 105 以上の値は最大でも 20 個しか存在しない – 存在するとすると Π Ai
≦10100 と矛盾 – 適当に大きい方から 20 個程度取り除いてみよう • A を降順に並び替えたあと先頭 20 個を取り除いた 数列 B について同様の問題を考えてみることにする – 制約は B の先頭の値を B0 としたとき, – 1 ≦ |B| ≦ 80 – 1 ≦ Bi ≦ B0 – 1 ≦ Σ log10 Bi ≦ 100 - 20log10 B0
考察 • 強いテストケースの気持ちになると、与えられた 制約下のもと ΣBi を最大化すればよいことがわかる • ΣBi を最大化するためにはどうすればよいか? –
なるべく大きい数を可能な限り突っ込むのが最適 – 数列 A をある値 x が 20 + k 個 並んでいて他が 1 である数列 とする – ある k について x = 10100/(20+k) が ΣBi が最大になり, 右図はそのときの ΣBi を示す – ΣBi は最大でも 105 を超えない 0 10000 20000 30000 40000 50000 60000 70000 80000 0 5 10 15 20 ΣBi k 10^(100/(20 + k))k + (80 - k)
想定解法 (半分全列挙+DP) • Π Ai ≦10100 の制約より、降順に並べ直して先頭から 20 個程度 取り除いた数列
B の総和は 105 を超えない – これならば動的計画法を用いて解くことが可能 • 先頭 20 個程度ならば O(2n) かけて全探索可能 • 半分全列挙のようなことをすればよいことが分かる – こういうのを半分全列挙と呼んでいいのかは知らない
まとめ 1. 与えられる数列 A を降順に並べた数列を B とする 2. B の先頭
k 個を C ,残りを D とする 3. D の部分列で作れる数を O(|D|ΣDi ) で前計算 4. C の使い方を O(2|C|) で全探索 5. A の部分列に総和が X であるようなものが 存在するならば経路復元を行う • 適切な k を選ぶと3, 4 のどちらも 107 ステップ程度 – 定数倍はそこまできつくないので十分間に合う