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
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
数列をプレゼントに / yukicoder-no-332
camypaper
November 07, 2017
More Decks by camypaper
See All by camypaper
門松と魔法(2) 解説 / yukicoder-no-284
camypaper
0
160
DSU on Tree
camypaper
0
5k
部分永続 Union Find / persistent_dsu
camypaper
1
3.8k
五輪ピック / yukicoder-no-408
camypaper
0
280
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
630
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
How to train your dragon (web standard)
notwaldorf
97
6.7k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
420
The SEO Collaboration Effect
kristinabergwall1
1
520
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
400
Automating Front-end Workflow
addyosmani
1370
210k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Tell your own story through comics
letsgokoyo
1
1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
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 ステップ程度 – 定数倍はそこまできつくないので十分間に合う