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
AtCoder Heuristic First-step Vol.1 講義スライド
Search
terry-u16
March 23, 2025
Programming
2
980
AtCoder Heuristic First-step Vol.1 講義スライド
AtCoder Heuristic First-step Vol.1 (
https://atcoder.jp/contests/ahf1
) で使用した講義スライドです。
terry-u16
March 23, 2025
Tweet
Share
More Decks by terry-u16
See All by terry-u16
AHC041解説
terryu16
1
710
月刊 競技プログラミングをお仕事に役立てるには
terryu16
2
1.4k
AHC035解説
terryu16
0
1.3k
TOYOTA AHC 至高のアルゴリズム解説会 - Transit Warehouse 解説
terryu16
0
1.9k
AHC028解説
terryu16
0
1k
メタヒューリスティクスで広がる「解けた!」の世界
terryu16
12
5.7k
AHC020解説
terryu16
0
1.6k
Other Decks in Programming
See All in Programming
複雑なフォームと複雑な状態管理にどう向き合うか / #newt_techtalk vol. 15
izumin5210
4
2.5k
AtCoder Heuristic First-step Vol.1 講義スライド(山登り法・焼きなまし法編)
takumi152
3
950
신입 안드로이드 개발자의 AI 스타트업 생존기 (+ Native C++ Code를 Android에서 사용해보기)
dygames
0
490
今から始めるCursor / Windsurf / Cline
kengo_hayano
0
110
本当だってば!俺もTRICK 2022に入賞してたんだってば!
jinroq
0
200
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.1k
Gunma.web #55
tinykitten
0
130
バックエンドNode.js × フロントエンドDeno で開発して得られた知見
ayame113
4
1.2k
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
6
3k
PHPUnit 高速化テクニック / PHPUnit Speedup Techniques
pinkumohikan
1
1.1k
AI時代のプログラミング教育 / programming education in ai era
kishida
22
20k
GDG Super.init(version=6) - From Where to Wear : 모바일 개발자가 워치에서 발견한 인사이트
haeti2
0
540
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
22
2.6k
Writing Fast Ruby
sferik
628
61k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
28
2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
A Philosophy of Restraint
colly
203
16k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
460
Measuring & Analyzing Core Web Vitals
bluesmoon
6
320
Producing Creativity
orderedlist
PRO
344
40k
Done Done
chrislema
183
16k
Building a Modern Day E-commerce SEO Strategy
aleyda
39
7.2k
Transcript
問題理解と貪欲法 松尾 充 (@terry_u16) 2025/3/23 AtCoder Heuristic First-step Vol.1
AtCoder Heuristic First-step Vol.1の目的 解法の選択方針について学ぶ 貪欲法の書き方・改善方法について体験する 山登り・焼きなまし法の実装を体験する 今日出会ったメンバーと仲良くなる
AtCoder Heuristic First-step Vol.1の流れ 今日は基本的な貪欲・山登り・焼きなましについて学びます 約1週間のコンテストを経て、上位チームをコンテストページで表彰します! 3/23 学習 3/23~3/28 コンテスト
後日 表彰 参加記も書いてもらえると 嬉しいです!
「問題理解と貪欲法」の流れ 講義・グループワーク (GW)・演習を通して学んでいきます 実際に各グループで貪欲法や改善案を考えるグループワークもありますので 楽しみにしていてください! 講義 問題文の 理解 講義 解法選択
方針 GW 貪欲法を 考えよう 演習 貪欲法の 実装 GW 改善案を 考えよう
問題文の理解と解法の選択方針
今回のお題:Food Delivery 今回はFood DeliveryというAHC過去問を題材に皆で解いていきましょう ざっくり言うと「注文の効率的な配達経路を決める」問題 AHC過去問なので 検索すれば解説記事が出てきますが、 コンテスト期間中はできるだけ 解説記事などは見ずに自分の力で チャレンジしてみてください!
Food Delivery概要 ざっくりまとめると以下のような問題 • 二次元平面が舞台 • 1000件の注文が入っている • 注文 𝑖
はレストラン 𝑎𝑖 , 𝑏𝑖 から目的地 𝑐𝑖 , 𝑑𝑖 への配達 • 1000件の中から好きな50件を選んで配達を行う • 料理は複数個同時に運ぶことができる • 2点間 𝑥𝑖 , 𝑦𝑖 , 𝑥𝑖+1 , 𝑦𝑖+1 の移動にはマンハッタン距離 𝑥𝑖 − 𝑥𝑖+1 + 𝑦𝑖 − 𝑦𝑖+1 だけの時間がかかる • オフィスから出発し、料理の配達を終えてオフィスに戻ってくるまでの 総移動時間をできるだけ短くしたい
ビジュアライザ確認 問題文を読むのとビジュアライザの解答例を見るのは合わせて1セット 最近のAHCは例が付いているので、眺めて問題文を正しく理解しよう レストラン1 目的地1 目的地3 レストラン2 レストラン3 オフィス 目的地2
1. オフィス発 2. レストラン1 3. 目的地1 4. レストラン2 5. レストラン3 6. 目的地3 7. 目的地2 8. オフィス着
解法選択フローチャート 問題文を読む 普通の貪欲を書く
なぜ普通の貪欲? 問題文を一度読んだだけで何が重要か理解するのは常人には不可能 簡単な解法を動かしてみることで、問題をより深く理解できる 方針を立てる 実装する 実行結果を見る 新たな気付きを得る 一発で天才的な解法に 辿り着くのではなく、 このサイクルを
どれだけ回せるかが AHCのカギ
貪欲を書くときに重要なこと いきなり天才貪欲を書こうとしないことが大事 問題文の理解と割り切り、5分で思い付く超簡単な貪欲から始めよう TOYOTA Programming Contest 2023 Summer final 「コンテナがランダムな順番で運び込まれるので
できるだけ順番通りに運び出せるように配置してください ただし入口から通路を通って辿り着けないマスは操作できません」 という問題 自分は初手で「運び込むときは適当なところに配置し 運び出すときは到達可能で最も番号が小さいコンテナを運び出す」 という貪欲を実装 「とりあえず簡単な貪欲」は上級者でも有効な戦法 ちなみにこのあと優勝しました
貪欲法
貪欲を考えてみよう 同じグループの人と一緒にどんな貪欲が考えられるか相談してみましょう! 2分間個人で考えてみて、3分間で案を出し合ってみてください! 恥ずかしがらない! 5分どころか5秒で考えた “あたりまえ貪欲” でOK!解法が被っても気にしない! 色々な考え方を認める! 最適化には “多様性”
が大事!自分になかった視点を褒めてあげよう! アイデアを膨らませる! 違う視点から見たらもっと良くなるかも?相手を尊重しつつさらに伸ばしてみよう!
貪欲法の一例 1. 現在地から最も近いレストランに行くことを50回繰り返す 2. 一番近い目的地に行くことを50回繰り返して、オフィスに戻る 次のレストラン候補を全て調べて 最も近いレストランに移動 同時に受けた注文リストに追加 受けた注文に対応する目的地を全て調べて 最も近い目的地に移動
同時に受けた注文リストから削除 1 2
貪欲法を実装してみよう テンプレコードを配布するので、穴埋め形式で貪欲法を実装してみましょう 1段階目を実装したら一旦実行してビジュアライザを見るのがオススメ 次のレストラン候補を全て調べて 最も近いレストランに移動 同時に受けた注文リストに追加 受けた注文に対応する目的地を全て調べて 最も近い目的地に移動 同時に受けた注文リストから削除 1
2
実装タイム 困ったときには問題ページの質問タブから受け付けます! 必要事項をご記入頂ければスタッフが順番に伺います 必要事項 ① テーブル名 ② 言語 ③ 質問内容
順番待ちになるかもしれませんが よろしくお願いします
ダメ出しをしてみよう ビジュアライザを見て、イマイチな点とシンプルな改善案を挙げてみましょう グループで3分ほど話し合ってみてください! 場当たり的な改善案でもOK! 直感にしたがって どんどん挙げてみましょう!
ダメ出しの例 例としてこのようなイマイチな点を挙げてみました この中の1つについて実際に改善を行ってみましょう • レストランの近さだけを見ているので 目的地が全体的に遠すぎ • 後半のルートが 行ったり来たりで効率が悪い •
レストランを回るついでに 目的地に配達しても良いのでは • レストラン-目的地のペアの距離 (灰色の線の長さ)が遠すぎる
レストランと目的地のペアについて オフィスからの距離が片方でも 400以上なら候補から外す 貪欲法の改善 遠い目的地に行くのはよくなさそうなので レストラン・配達先のどちらもオフィスに近い注文だけを対象にしてみる 1 2 2 1
距離100 距離300 距離300 距離500 最も近い レストランに 移動する貪欲 最も近い 目的地に 移動する貪欲 2 3 1
改善結果 改善結果はこんな感じ まだまだ改善余地はあるので、色々と試してみてください! 総移動距離 7918 総移動距離 6308
ご清聴ありがとうございました!