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
AOJ 0112 A Milk Shop 解説
Search
kagamiz
March 28, 2013
Programming
0
460
AOJ 0112 A Milk Shop 解説
OkNCT-ICT 2013 春合宿 Day 4 (らしい) に解説したもの.
kagamiz
March 28, 2013
Tweet
Share
More Decks by kagamiz
See All by kagamiz
KCS v2. の開発
kagamiz
0
260
internship final presentation
kagamiz
0
1.3k
internship-middle term presentation
kagamiz
0
1.1k
すうがくのまほう
kagamiz
0
340
ご当地料理の紹介
kagamiz
0
420
オンラインジャッジシステムの実装
kagamiz
0
1.2k
AOJ 0022 Maximum Sum Sequence 解説
kagamiz
1
1.5k
AOJ 0557 A First Grader 解説
kagamiz
0
980
JOI2013 本選1 Illumination 解説
kagamiz
0
350
Other Decks in Programming
See All in Programming
TypeScriptでDXを上げろ! Hono編
yusukebe
3
650
CDK引数設計道場100本ノック
badmintoncryer
2
360
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
190
A full stack side project webapp all in Kotlin (KotlinConf 2025)
dankim
0
140
Quand Symfony, ApiPlatform, OpenAI et LangChain s'allient pour exploiter vos PDF : de la théorie à la production…
ahmedbhs123
0
210
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
240
Deep Dive into ~/.claude/projects
hiragram
14
11k
すべてのコンテキストを、 ユーザー価値に変える
applism118
4
1.4k
Result型で“失敗”を型にするPHPコードの書き方
kajitack
5
980
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
600
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
670
生成AI時代のコンポーネントライブラリの作り方
touyou
1
260
Featured
See All Featured
Statistics for Hackers
jakevdp
799
220k
Music & Morning Musume
bryan
46
6.7k
Designing for Performance
lara
610
69k
How to Think Like a Performance Engineer
csswizardry
25
1.7k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Scaling GitHub
holman
460
140k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Transcript
AOJ 0112 A Milk Shop 解説 @kagamiz
問題の概要 • n 人のお客さんがいます. • i 番目の人がミルクを入れるのにはai 分の時間がかかりま す. •
1 度に1 人の人がミルクを入れられるとき, 待ち時間の合計 を最小化してください.
問題文の復習 客の番号 ミルクを入れる時間 かかる待ち時間 客1 2 分 0 分 客2
6 分 2 分 客3 4 分 2 分 + 6 分 客4 3 分 2 分 + 6 分 + 4 分 客5 9 分 2 分 + 6 分 + 4 分 + 3 分 合計 37 分
問題文の復習 • 2 番目の人と3 番目の人を入れ替えてみる 客の番号 ミルクを入れる時間 かかる待ち時間 客1 2
分 0 分 客2 6 分 2 分 客3 3 分 2 分 + 6 分 客4 4 分 2 分 + 6 分 + 3 分 客5 9 分 2 分 + 6 分 + 3 分 + 4 分 合計 35 分
問題文の復習 • 昇順にすると爆速になりそう 客の番号 ミルクを入れる時間 かかる待ち時間 客1 2 分 0
分 客2 3 分 2 分 客3 4 分 2 分 + 3 分 客4 6 分 2 分 + 3 分 + 4 分 客5 9 分 2 分 + 3 分 + 4 分 + 6 分 合計 31 分
( ^o^) 昇順にすると爆速になりそう
( ^o^) 昇順にすると爆速になりそう • ( ⊖ ) ˘ ˘ 。o(まてよ,
なんでそれでいいんだろう)
( ^o^) 昇順にすると爆速になりそう • ( ⊖ ) ˘ ˘ 。o(まてよ,
なんでそれでいいんだろう) • |とりあえずSubmit| ┗(☋` )┓三
( ^o^) 昇順にすると爆速になりそう • ( ⊖ ) ˘ ˘ 。o(まてよ,
なんでそれでいいんだろう) • |とりあえずSubmit| ┗(☋` )┓三 • ( ) ◠‿◠ ☛Wrong Answer
( ^o^) 昇順にすると爆速になりそう • ( ⊖ ) ˘ ˘ 。o(まてよ,
なんでそれでいいんだろう) • |とりあえずSubmit| ┗(☋` )┓三 • ( ) ◠‿◠ ☛Wrong Answer • ▂▅▇█▓▒░(’ω’) █▇▅▂ ░▒▓ うわあああああああ
( ^o^) 昇順にすると爆速になりそう • ( ⊖ ) ˘ ˘ 。o(まてよ,
なんでそれでいいんだろう) • |とりあえずSubmit| ┗(☋` )┓三 • ( ) ◠‿◠ ☛Wrong Answer • ▂▅▇█▓▒░(’ω’) █▇▅▂ ░▒▓ うわあああああああ • 最悪のケースを考えてみよう
最悪のケース • 10000 人のお客さんがそれぞれ60 分ずつ待つときが最悪 の待ち時間になる. • その時にかかる待ち時間の合計は, n 番目の人は(n
– 1) * 60 分待たないといけないので, Σ[i = 1, 10000] (i – 1) * 60 = 2999700000 分 となる. • しかしint 型で表せる数の最大値は2147483647 なので, int 型で総和を求めるとWrong Answer となる. => 直すとAC
やっぱり昇順でいれるのが最適? • “しかしint 型で表せる数の最大値は2147483647 なので, int 型で総和を求めるとWrong Answer となる.=>直すと AC”
• こういう風に, 貪欲的に「その場での最善」を選択してい くことを繰り返すアルゴリズムを貪欲法という. • ここでは, なぜ貪欲法でうまくいくかを簡単に証明.
問題文の復習[再掲] • 昇順にすると爆速になりそう 客の番号 ミルクを入れる時間 かかる待ち時間 客1 2 分 0
分 客2 3 分 2 分 客3 4 分 2 分 + 3 分 客4 6 分 2 分 + 3 分 + 4 分 客5 9 分 2 分 + 3 分 + 4 分 + 6 分 合計 31 分
問題の言い換え • i 番目の人は, 待ち時間に(n – i) 回作用する. • つまり,
n 次元ベクトル a = (a1, a2, …, an), b = (n – 1, n – 2, …, 1, 0) としたとき, それぞれの成分を入れ替えて内積a ・ b を最小化する問題 となる.
問題の言い換え • a の各成分を昇順に入れ替えたベクトルをa', b は成分が 降順にならんだベクトルとすると, 次の並べ替え不等式が 成立する. a'・
b ≦ a ・ b (≦ a'' ・ b) • ここで, a'' は a の各成分を降順に並び替えたベクトル.
証明の概略 • a とb の各成分の個数が2 個だとする. • このとき, a1 ≦
a2, b1 ≦ b2 とすると • a1 b1 + a2b2 – (a1b2 + a2b1) = (a1 – a2)(b1 – b2)≧0 ∴a1b1 + a2b2 ≧ a1b2 + a2b1 • 各成分がn 個ある時も, ベクトルの2 つの成分に注目して同じ事 を行えば良い.