社内 
プログラミング勉強会#1 
プロアリんごさん→
勉強会? 
ぷろぐらみんぐの勉強会? 
なにすんの?? 
ぷろぐらみんぐ??
はじめに
これからどんな内容・頻度になっていくかは 
みなさんの状況によって変わっていきます
それを踏まえて…
より効率の良い 
アルゴリズムを考える 
練習をします!!
教本 
あのアリ本!
どんな本?
プログラミングコンテスト 
の問題を通して… 
アルゴリズム 
のしくみや考え方を 
楽しく習得できる本
進め方
進め方の1例 
1. 必要に応じて練習問題やアルゴリズムの紹介 
2. 今日のお題にチャレンジ 
3. 解説/解答を読んで理解 
4. 自分の得意な言語で書いてみる(採点はしてもらえないけれど) 
5. おまけ:LT(LightningTalk)で情報共有など 
# 毎回担当者を変えるのがいいかな
おまけ
計算量 
って意識してますか?
大学のアルゴリズムの講義とかで 
やりましたよね( ́◔◡◔`)?
計算量について知りたい方は 
詳しくはいろいろぐぐってみてください^q^ 
•計算量のはなし - 赤い黒歴史を蓄積する 
http://catupper.hatenablog.com/entry/ 
20131207/1386402713 
•計算量 
http://www.slideshare.net/catupper/ss-26238956 
ex. forループ4重なら O(n^4) 
ex. マージソートなら O(n log n)
初回ということで、ウォーミングアップ!
アリさん問題(Ants:POJ No.1852) 
長さLcmの竿の上をn匹のアリが毎秒1cmのスピードで歩いていま 
す。アリが竿の端に到達すると竿の下に落ちていきます。また、竿 
の上は狭くてすれ違えないので、二匹のアリが出会うと、それぞれ 
反対を向いて戻っていきます。 
各アリについて、現在の竿の左端からの距離Xiはわかりますが、ど 
ちらの方向を向いているのかはわかりません。 
すべてのアリが竿から落ちるまでにかかる最小の時間と最大の時間 
をそれぞれ求めなさい。 
http://poj.org/problem?id=1852 
制約 
1 ≦ L ≦ 10^6 
1 ≦ n ≦ 10^6 
0 ≦ Xi ≦ L 
入力例 
L = 10 
n = 3 
x = {2, 6, 7} 
出力例 
min = 4 
max = 8 
※min:(左、右、右) 
※max:(右、右、右)
正解例 その1 
アリの向いている方向は、1匹につき2通り。 
n匹いるので、全部で2^n通り。 
: 
: 
: 
nがでかいとやばいね!! 
現実的じゃないね!! 
http://poj.org/problem?id=1852
正解例 その2 
最小のケースは、すべてのアリが近い方の端に向かうパターン。 
では、最大になるケースは? 
まず問題をもっと簡単化しましょう。 
衝突後逆方向に行くのと、すれ違うのは同じ! 
そのため、最大になるのは、 
端までの距離の最大値を求めればOK! 
出会った後… 
逆方向へ進むのも、すれ違うのも同じ 
http://poj.org/problem?id=1852
完 
またな!

社内勉強会 2014/10/08