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.4k
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
770
月刊 競技プログラミングをお仕事に役立てるには
terryu16
2
1.4k
AHC035解説
terryu16
0
1.4k
TOYOTA AHC 至高のアルゴリズム解説会 - Transit Warehouse 解説
terryu16
0
1.9k
AHC028解説
terryu16
0
1k
メタヒューリスティクスで広がる「解けた!」の世界
terryu16
12
5.9k
AHC020解説
terryu16
0
1.6k
Other Decks in Programming
See All in Programming
Sharing features among Android applications: experience feedback
jbvincey
0
110
AWS で実現する安全な AI エージェントの作り方 〜 Bedrock Engineer の実装例を添えて 〜 / how-to-build-secure-ai-agents
gawa
8
830
RubyKaigi Dev Meeting 2025
tenderlove
1
180
監視 やばい
syossan27
10
9.5k
PHPで書いたAPIをGoに書き換えてみた 〜パフォーマンス改善の可能性を探る実験レポート〜
koguuum
0
170
プロダクト横断分析に役立つ、事前集計しないサマリーテーブル設計
hanon52_
2
450
複雑なフォームの jotai 設計 / Designing jotai(state) for Complex Forms #layerx_frontend
izumin5210
4
1k
KawaiiLT 登壇資料 キャリアとモチベーション
hiiragi
0
120
地域ITコミュニティの活性化とAWSに移行してみた話
yuukis
0
240
「理解」を重視したAI活用開発
fast_doctor
0
110
大LLM時代にこの先生きのこるには-ITエンジニア編
fumiyakume
7
3k
音声プラットフォームのアーキテクチャ変遷から学ぶ、クラウドネイティブなバッチ処理 (20250422_CNDS2025_Batch_Architecture)
thousanda
0
210
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.2k
Site-Speed That Sticks
csswizardry
5
500
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
670
Java REST API Framework Comparison - PWX 2021
mraible
30
8.5k
Building Adaptive Systems
keathley
41
2.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Fireside Chat
paigeccino
37
3.4k
Typedesign – Prime Four
hannesfritz
41
2.6k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.4k
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
ご清聴ありがとうございました!