SlideShare a Scribd company logo
プログラミングコンテスト入門
アルゴリズム研究室 井上祐馬
プログラミングコンテストとは?
• 複数の問題が与えられる
• 制限時間内に与えられた問題をできるだけ多く解く
• 「問題を解く」とは、「問題を解くプログラムを作成する」
ことである
問題例:ガソリンスタンド
• ガソリンスタンドを経由して車で目的地へ
• 1ℓで1km進める。各地で一定量のガソリンが補給可能
• 最小何回の補給で目的地へ辿り着けるか?
2ℓ
5ℓ 3ℓ
8ℓ
10ℓ
4km
4km
2km
5km
2km
6km
初期:10ℓ
問題文の構成
問題背景
入力形式
出力形式
サンプル出力
サンプル入力
例:問題文
• あなたは出発地点からLkm離れた到着地点に車で向
かいたい。
• 1km進むためには1ℓのガソリンを消費する。
• 出発時点であなたはPℓのガソリンを持っている。
• 途中でガソリンが0になってしまうと、移動できなくなる。
• ただし、道中N箇所あるガソリンスタンドに立ち寄れる。
• i番目のガソリンスタンドは出発地点から𝑎𝑖kmの地点に
存在し、そこでは𝑏𝑖ℓのガソリンを補給できる。
• 車は無限にガソリンを積めるとすると、到着地点に到
達可能か?可能ならば、最小の補給回数を求めよ。
入力形式
• N
• 𝑎1 𝑏1
• 𝑎2 𝑏2
• …
• 𝑎 𝑁 𝑏 𝑁
• L P
• 1≦N≦10000
• 1≦L≦1000000, 1≦P≦1000000
• 1≦ 𝑎𝑖 < L, 1≦𝑏𝑖≦100
出力形式
• 到着地点に到達できないなら、-1を
• 到達できるなら、最小の補給回数を
• 一行で出力せよ
サンプル
Input:
4
4 4
5 2
5 2
11 5
15 10
25 10
Output:
2
コンテストの流れ
問題理解
アルゴリズム
考察
実装
サンプルテスト 自前テスト 提出 AC
問題解釈
• 問題を正しく理解する
• 記述が複雑だったり、英語だったり、斜め読みしたりすると誤
読がしばしば起きる
• 誤読している問題は(奇跡的偶然がない限り)永遠に解けない
• 問題を正しく理解できているかを確かめるためには
• 改めて読み直して、読み落とし・勘違いがないか確かめる
• サンプルを手で解いてみる
• チーム戦なら、チームメイトにも読んでもらい、内容を確認し
合う
アルゴリズム考察
• 問題を解く手順(=アルゴリズム)を考える
• プログラミングコンテストで最も重要と言ってもよいフェイズ
• 問題から導ける事実をかき集める
• 「現在のガソリン<次のGSへの距離」なら進めない
• 使うGSが予め決まっていれば、到達できるか判定できる
• 「GSを訪れる=以降そのGSで補給する権利を得る」 etc…
• 事実に基づいてアルゴリズムを設計する
• 「GSが決まれば到達判定可能⇒GSの決め方を全部試す」など
• アルゴリズムに必要な情報を求めるためにサブ問題を解くことも
しばしばある
アルゴリズム考察
• 計算量の見積もりは大事
• ICPCは明確な実行時間制限はないが、さすがに3時間で終
わらないプログラムは論外
• O-記法(オーダー記法)を用いて評価することが多い
• 計算回数をデータの大きさの関数として概算する
• 例えば、n個から3つ選んだ和を求めるとき3重ループで計算した場合、
𝑛(𝑛−1)(𝑛−2)
6
回の足し算を行う。これを大まかに見積もってO(𝑛3)と書く
• O()の中身が最大になるように制約の数値を入れてみる
• 例えば、1≦n≦100のとき、O (𝑛3)はO(1000000) = O(106)
• 大まかに、 O(107~108)程度で1秒ほどかかる
• これを大きく越えるときは、アルゴリズムを見直す
アルゴリズム考察
アルゴリズム考察
問題の特徴を
分析
既存のアルゴリ
ズムへ帰着
アルゴリズムに
必要な情報を
得る問題を解く
問題の特徴を
分析
既存のアルゴリ
ズムへ帰着計算量・正当性
の検討
計算量・正当性
の検討
アルゴリズム考察(問題の例)
アルゴリズム考察
GSを訪れる =
以降いつでもその
GSで補給可能
貪欲法:
先に進めないとき、今まで
訪れた中で最大補給
できるGSで補給
N個の中の
最大値を高速に
求めたい
O( 𝑁)以下で
最大値を
求めればよい
優先順位付き
キュー
・証明可能(証明略)
・O(N)回、最大のGS
を求める
・ヒープで実装可
・O(log N)
実装
• アルゴリズムをきちんと考察できていれば、あとはその
アルゴリズムを実装するだけ
• アルゴリズムの設計をきちんとしよう
• とはいえ、複雑な部分も多い
• 頻出テクニックを身につけておく
• STLなど、標準で使えるものを最大限活用する
• 自作のライブラリ等によく使うアルゴリズムをまとめる
• これらは、バグを減らす意味でも役立つ
実装(入力)
int n,L,P;
int a[10000],b[10000];
cin >> n;
for(int i=0;i<n;i++)cin >> a[i] >> b[i];
cin >> L >> P;
実装(アルゴリズム)
dis[0] = a[0];
for(int i=1;i<n;i++)dis[i] = a[i] – a[i-1];
dis[n] = L – a[n-1];
int curGas = P, res = 0;
priority_queue<int> q;
for(int i=0;i<=n;i++){
while(curGas < dis[i]){
if(q.empty())return -1;
curGas += q.top(); q.pop();
res++;
}
q.push(b[i]);
}
return res;
dis[i]にi番目の地点から
次の地点への距離を記録
curGas:現在の残りガソリン, res:答えをメモ
優先順位付きキュー(C++ STLにある)
次の地点への移動に必要なだけ補給
使えるGSがもうなかったら到達不可
最大値が常にtopに来ている
補給したので回数を1増やす
今いるGSをこれ以降使えるようにする
最後まで到達できたら、補給回数を返す
テスト
• どんな優秀なプログラマでも、バグは埋め込んでしまう
もの
• テストは必ず行いましょう
• まずはサンプルが正しく動くか確かめる
• サンプルだけでは試せないやばそうなケースを自分で作って
確かめてみる
• 最大ケース、最小ケース
• グラフ:負の辺、ループ、多重辺
• 計算:0や負の値、オーバーフロー
• 幾何:図形が接している etc…
• どんなケースがやばそうか、は経験が大事
• 一度したミスはチェックシートなどにまとめるとよいかも
テストで失敗したら
問題理解
アルゴリズム
考察
実装
サンプルテスト 自前テスト 提出
AC
WA,TLE,
etc…
失敗したケースを手で
解いたらサンプルと合わない
:いい感じ :つらぽよ
テストで失敗したら
問題理解
アルゴリズム
考察
実装
サンプルテスト 自前テスト 提出
AC
WA,TLE,
etc…
失敗したケースの挙動が
想定と異なる
:いい感じ :つらぽよ
テストで失敗したら
問題理解
アルゴリズム
考察
実装
サンプルテスト 自前テスト 提出
AC
WA,TLE,
etc…
実装してみると計算量の
見積もりに穴があった
:いい感じ :つらぽよ
失敗したら
問題理解
諦め
アルゴリズム
考察
実装
サンプルテスト 自前テスト 提出
AC
WA,TLE,
etc…
:いい感じ :つらぽよ
コンテストの流れ
• 「諦め」はネタではない!
• 解ける問題から解く、解けないときは他の問題も目を通そう
• 他に解く問題がないときは諦めてはいけない。
• 問題が解けないのはたいていこんなとき
• 問題解釈がそもそも間違っている
• アルゴリズムが間違っている
• 出力が正しくない
• 計算量の見積もりに誤りがある
• 実装がバグっている
• オーバーフローしている
• 解法(アルゴリズム)が思いつかない
まとめ
• プログラミングコンテストは・・・
• 問題を読んで特徴を分析し、
• 十分に効率的なアルゴリズムを考え、
• それを実装するコンテスト
• よい成績を残すために必要なものは・・・
• アルゴリズムやデータ構造の知識
• 必要な情報をピックアップしたり導くための分析、柔軟な思考
• 頻出な実装ポイントの経験やテクニック
• デバッグの勘
• 解ける問題の選定

More Related Content

PDF
CODE FESTIVAL 2015 沖縄ツアー 解説
PPTX
2011 02-21 第1回@freaks勉強会
PDF
DP特集
PDF
直前合宿 講義スライド
PDF
定番アルゴリズムを徹底理解!
CODE FESTIVAL 2015 沖縄ツアー 解説
2011 02-21 第1回@freaks勉強会
DP特集
直前合宿 講義スライド
定番アルゴリズムを徹底理解!

Viewers also liked (8)

PDF
ダイクストラ法
PDF
グラフを扱おう:最短路問題
PDF
AtCoder Beginner Contest 035 解説
PDF
大規模グラフアルゴリズムの最先端
PDF
Learning Convolutional Neural Networks for Graphs
PPTX
AtCoder Beginner Contest 034 解説
PDF
AtCoder Beginner Contest 033 解説
ダイクストラ法
グラフを扱おう:最短路問題
AtCoder Beginner Contest 035 解説
大規模グラフアルゴリズムの最先端
Learning Convolutional Neural Networks for Graphs
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 033 解説
Ad

More from HCPC: 北海道大学競技プログラミングサークル (20)

PDF
ACPC 2017 Day3 F: 掛け算は楽しい
PDF
ACPC 2019 Day3 F: 部分文字列分解
PDF
ACPC 2019 Day3 E: 総和の切り取り
PDF
HUPC 2019 Day1 F: グリッドの番号
PDF
HUPC 2019 Day1 E: 最短経路の復元
PDF
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 E: 総和の切り取り
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 E: 最短経路の復元
Ad

初めてのプロコン