競技プログラミング講義
#1 「導入編」
競技プログラミングの講義です
競技プログラミングとは
「問題で与えられた条件に従って、
早く正確にプログラムを書く競技」
( 引用 : 競技プログラミング wiki )
競技プログラミングとは
「問題で与えられた条件に従って、
早く正確にプログラムを書く競技」
( 引用 : 競技プログラミング wiki )
問題を解くにあたって
● 問題を解く
– 効率的な解法を考える
– 考えた解法を(バグを埋めこまないよう
に)正しく実装する
問題を解くにあたって
● 問題を解く
– 効率的な解法を考える
– 考えた解法を(バグを埋めこまないよう
に)正しく実装する
問題を解くにあたって
● 問題を解く
– 効率的な解法を考える
– 考えた解法を(バグを埋めこまないよう
に)正しく実装する
コードについて
● 早く書くのは重要
● きれいに書くのも重要
– インデントはちゃんと揃える
– ( C 言語で)中括弧を使いすぎない(ネス
トしすぎない)
– 変数名はできるだけわかりやすいものを
( 1〜5文字程度)
やるだけ
                 Brute Force
やるだけ (brute force) とは
● 問題文の通り実装するだけで正解でき、工
夫などを必要としない問題
● 特に実装の大変な問題は実装するだけ
(implemention) と呼ばれることもある
● ハラスメントの常套句
● ハラスメンターにかかればどんな問題でもやるだけと言
われる
〜実装タイム〜
NPCA Judge  問題「講義用問題 1 」
問題内容
●
サイズ N の数列 A の A[l] 〜 A[r] の和を求
めるクエリを M 個処理してください
●
1 N 1,000≦ ≦
●
1 M 1,000≦ ≦
●
1 A[i] 1,000,000,000≦ ≦
( ^o^) こんな問題やるだけじゃないか
( ˘ ˘)⊖ 。 o( どうせ Accepted だろ )
|System Test| (┗ ☋ ` )┓ 三
( )◠‿◠ ☛ Wrong Answer
(’ω’)▂▅▇█▓▒░ ░▒▓█▇▅▂ うわああああ
ポイント①:制限時間・メモリ
● 問題には制限時間・メモリ制約というもの
があり、それ以内で処理しなくてはならな
い
● 制限時間は計算量で大体計算できる
● メモリ使用量も使った配列の大きさなどか
ら計算できる
ポイント②:計算量
●
計算量とは
– その名の通り計算した量
– 代入、四則演算などが行われた回数
– For 文の繰り返し回数から概算できる
●
計算量と時間ー 1 秒で
– 計算量 :10^6 → まず大丈夫
– 計算量 :10^7 → まだ大丈夫
– 計算量 :10^8 → かなり厳しい
ポイント③:インデックス
● 問題文での番号の付け方は大体 1 から
● 配列で扱う場合0からなので0からの方が
都合がいい
ポイント④: int 型
●
int 型の変数で扱える値の範囲は大体
±2×10^9 くらいまで
●
今回の問題では答えは最高
10^9×10^3 = 10^12
くらいになりうる
●
long long int 型なら 10^18 くらいまで入る
→ 大勝利!
おまけ
● 今回はやるだけで解くことができた
が、 N,M が大きくなると…?
→ 夏合宿講義 by catupper
練習問題
● AOJ Volume.5
各年の問題 (Source が JOI ○○○○ となってい
る問題 ) のうち最初の 2 問程度
ただし 2011 年分を除く
→ 次回 #2 「全探索」
To be continued...

導入