Slide 1

Slide 1 text

競プロへの誘 -いざな- LT会(仮) 2022/03/25 u76ner

Slide 2

Slide 2 text

競プロとは 2 - 競プロとは
 - 「競技プログラミング」の略
 
 - 競技プログラミングでは、参加者全員に同一の課題が出題され、より早く与えら れた要求を満足するプログラムを正確に記述することを競う。 
 (Wikipedia)


Slide 3

Slide 3 text

競プロとは 3 - 有名なやつの例
 - AtCoder


Slide 4

Slide 4 text

競プロとは 4 - 有名なやつの例
 - AIZU ONLINE JUDGE(AOJ)


Slide 5

Slide 5 text

競プロとは 5 - 問題の入力に対して解答に制限時間内に解答する 
 - だいたい2秒とかが多い気がする(↓ AtCoderでの例)
 


Slide 6

Slide 6 text

競プロとは 6 - 問題の入力に対して解答に制限時間内に解答する
 


Slide 7

Slide 7 text

競プロとは 7 - 問題の入力に対して解答に制限時間内に解答する
 
 - 問題を解くこと自体は原理的にできるが、 
 ナイーブに実装すると現実的な時間で解くことが不可能 であることが多い


Slide 8

Slide 8 text

計算量の例 8 - 例)
 - a n+2 = a n+1 + a n ,
 a 1 = 1,
 a 2 = 1
 - このとき、a 40 , a 100 を求めよ
 
 - いわゆるフィボナッチ数列


Slide 9

Slide 9 text

計算量の例 9 - ナイーブな実装
 
 
 


Slide 10

Slide 10 text

計算量の例 10 - ナイーブな実装
 
 
 - a 100 が計算できない
 
 - 計算時間
 - a 40 : 604 ms
 - a 45 : 6,808 ms
 - a 50 : > 1 min


Slide 11

Slide 11 text

計算量の例 11 - 改善点
 
 - a 50 = a 49 + a 48 
 = (a 48 + a 47 ) + (a 47 + a 46 )
 = (a 47 + a 46 ) + (a 46 + a 45 ) + (a 46 + a 45 ) + (a 45 + a 44 )
 = …


Slide 12

Slide 12 text

計算量の例 12 - 改善点
 
 - a 50 = a 49 + a 48 
 = (a 48 + a 47 ) + (a 47 + a 46 )
 = (a 47 + a 46 ) + (a 46 + a 45 ) + (a 46 + a 45 ) + (a 45 + a 44 )
 = …
 
 - 重複した計算を上手く記憶しておくことで速くできそう 


Slide 13

Slide 13 text

計算量の例 13 - 途中計算を記憶しておく実装


Slide 14

Slide 14 text

計算量の例 14 - 途中計算を記憶しておく実装
 
 
 
 - 計算時間
 - a 40 : ≒ 1ms
 - a 100 : ≒ 1ms
 
 - ちなみにこういうアルゴリズムを総称して動的計画法(DP)という 


Slide 15

Slide 15 text

エンジニアの視点から 15 - 競プロをやることの利点


Slide 16

Slide 16 text

エンジニアの視点から 16 - 競プロをやることの利点
 - 処理を軽くすることに目が向きやすい 


Slide 17

Slide 17 text

エンジニアの視点から 17 - 例)


Slide 18

Slide 18 text

エンジニアの視点から 18 - ナイーブにやる
 
 
 - 二重ループは改善できそう


Slide 19

Slide 19 text

エンジニアの視点から 19 - 連想配列を使う
 
 
 
 
 
 - 二重ループが解消できる


Slide 20

Slide 20 text

まとめ 20 - 競プロでは、計算方法自体はすぐわかるけど、 
 それを現実的な時間で計算できるかが求められる 
 
 - 普段の実装でも、細かい計算量の削減に目が行き届くようになる 


Slide 21

Slide 21 text

21