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
3
1.6k
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
850
月刊 競技プログラミングをお仕事に役立てるには
terryu16
2
1.5k
AHC035解説
terryu16
0
1.4k
TOYOTA AHC 至高のアルゴリズム解説会 - Transit Warehouse 解説
terryu16
0
2.1k
AHC028解説
terryu16
0
1.1k
メタヒューリスティクスで広がる「解けた!」の世界
terryu16
12
6.2k
AHC020解説
terryu16
0
1.7k
Other Decks in Programming
See All in Programming
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
570
Bytecode Manipulation 으로 생산성 높이기
bigstark
2
380
童醫院敏捷轉型的實踐經驗
cclai999
0
200
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
170
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
2
220
GoのGenericsによるslice操作との付き合い方
syumai
3
690
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
470
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
260
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
200
エラーって何種類あるの?
kajitack
5
320
来たるべき 8.0 に備えて React 19 新機能と React Router 固有機能の取捨選択とすり合わせを考える
oukayuka
2
870
Team operations that are not burdened by SRE
kazatohiei
1
260
Featured
See All Featured
The Invisible Side of Design
smashingmag
300
51k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Bash Introduction
62gerente
614
210k
Faster Mobile Websites
deanohume
307
31k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Balancing Empowerment & Direction
lara
1
380
Being A Developer After 40
akosma
90
590k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
Rails Girls Zürich Keynote
gr2m
94
14k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.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
ご清聴ありがとうございました!