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
690
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
700
月刊 競技プログラミングをお仕事に役立てるには
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
CIBMTR振り返り+敗北から学ぶコンペの取り組み方反省
takanao
1
480
아직도 SOLID 를 '글'로만 알고 계신가요?
sh1mj1
0
330
JavaOne 2025: Advancing Java Profiling
jbachorik
1
290
技術好きなエンジニアが "リーダーへの進化" によって得たものと失ったもの
pospome
5
1.3k
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
250
フロントエンドオブザーバビリティ on Google Cloud
yunosukey
0
150
高セキュリティ・高耐障害性・サブシステム化。そして2億円
tasukulab280
2
540
‘무차별 LGTM~👍’만 외치던 우리가 ‘고봉밥 코드 리뷰’를?
hannah0731
0
480
AIエージェントを活用したアプリ開発手法の模索
kumamotone
1
690
Go1.24で testing.B.Loopが爆誕
kuro_kurorrr
0
130
いまさら聞けない生成AI入門: 「生成AIを高速キャッチアップ」
soh9834
2
690
2025/3/18 サービスの成長で生じる幅広いパフォーマンスの問題を、 AIで手軽に解決する
shirahama_x
0
130
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Statistics for Hackers
jakevdp
797
220k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.7k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
The Pragmatic Product Professional
lauravandoore
32
6.5k
Gamification - CAS2011
davidbonilla
80
5.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
134
33k
Git: the NoSQL Database
bkeepers
PRO
429
65k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
The World Runs on Bad Software
bkeepers
PRO
67
11k
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
ご清聴ありがとうございました!