29
競競競競競競競競競競競競競 spin13

20160620 競技プログラミングのすゝめ

Embed Size (px)

Citation preview

Page 1: 20160620 競技プログラミングのすゝめ

競技プログラミングのすゝめ

spin13

Page 2: 20160620 競技プログラミングのすゝめ

競技プログラミングとは?

・問題が複数問出題される

・一定時間にどれだけ多く解けるかを競う

 ・早いだけではダメ! 正確さも必要

問題 A

問題 B

問題 C

問題 D

Page 3: 20160620 競技プログラミングのすゝめ

競技プログラミングとは?

a, b という入力が与えられるので , aを bで割った余りを出力しなさい.

問題自分の書いたソースコード

Judge Server

SubmitJudge Serverに用意された入力に正しく出力を返せれば点数に

Page 4: 20160620 競技プログラミングのすゝめ

どんなことが養われるのか

・与えられた問題に対する考察力

・アルゴリズムを考える力

・その問題を解決する実装力

Page 5: 20160620 競技プログラミングのすゝめ

例 1

0と 1で構成された入力が与えられるので,いくつかを 0 または 1 に変換して交互に並んでいるようにしたい.つまり 0の隣は常に 1で, 1の隣は常に 0.

いくつ変換すれば交互に並んでいるようにできるか,その最小値を返してください.

010001010 010101010

Page 6: 20160620 競技プログラミングのすゝめ

例 1

特に考えずに,最初の位置を基点として 1つ前の数字と次の数字が違うように並び替えてやればいい?

001011101

010101010

答えは7!

Page 7: 20160620 競技プログラミングのすゝめ

×

Page 8: 20160620 競技プログラミングのすゝめ

交互に並んでいる状態での最小

001011101

010101010

101010101

7

2

Page 9: 20160620 競技プログラミングのすゝめ

問題の考察

・ 0から始まって交互になるように変換

・ 1から始まって交互になるように変換

2パターンあるので注意が必要

Page 10: 20160620 競技プログラミングのすゝめ

いやいや .....

2パターンしかない!

Page 11: 20160620 競技プログラミングのすゝめ

答え 1

与えられた文字列長で 0と 1が交互に並んだ 2パターンを用意しておいて, 2つと比べて違う部分の数を数えればいいんじゃね?

入力

000110101001010101010101

101010101010

用意!

Page 12: 20160620 競技プログラミングのすゝめ

答え 2

000110101001010101010101

101010101010

7

5

片方と比較して出た答えともう片方と比較して出た答えを足すと文字列長 Nに等しくなる

ans = min(ans, strLeng - ans);

Page 13: 20160620 競技プログラミングのすゝめ

いろいろな解き方がある

解法は1つじゃない!

Page 14: 20160620 競技プログラミングのすゝめ

例 2

整数 Nが与えられるので, 1~Nに含まれる素数の数を答えよ.

制約1 N 1000000≦ ≦

2s以内 (多くの問題はこのようにプログラムが答えを返すまでの時間に制限がある )

Page 15: 20160620 競技プログラミングのすゝめ

例 2

普通に素数求めればええんじゃろ?

2からループ回していってその数が素数がどうか調べればいいんじゃないの?

Page 16: 20160620 競技プログラミングのすゝめ

×

Page 17: 20160620 競技プログラミングのすゝめ

例 2

制約1 N 1000000≦ ≦

2s以内 (多くの問題はこのようにプログラムが答えを返すまでの時間に制限がある )

→このやり方では 1000000が与えられたら 2s以内に答えがでない

Page 18: 20160620 競技プログラミングのすゝめ

例 2

愚直にがんばると計算量は O(N^2)くらい

100万 *100万の計算量だと到底間に合わない><

→もっと高速なアルゴリズムでやる必要がある

Page 19: 20160620 競技プログラミングのすゝめ

エラトステネスの篩

・見つけた素数の倍数を撃ち落とす

Page 20: 20160620 競技プログラミングのすゝめ

エラトステネスの篩

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

Page 21: 20160620 競技プログラミングのすゝめ

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

エラトステネスの篩

まずは最初の素数である 2より大きい 2の倍数を消していくこの時点で 2が素数であることが確定

Page 22: 20160620 競技プログラミングのすゝめ

エラトステネスの篩

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

次の素数である 3より大きい 3の倍数を消していく3が素数に確定

Page 23: 20160620 競技プログラミングのすゝめ

エラトステネスの篩

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

5より大きい 5の倍数を消していく5が素数に確定

Page 24: 20160620 競技プログラミングのすゝめ

エラトステネスの篩

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

29以下の全ての素数が求まった!

Page 25: 20160620 競技プログラミングのすゝめ

素数アルゴリズム

他にも ・ Atkinの篩

・ミラーラビン素数判定法

など色々 ....

Page 26: 20160620 競技プログラミングのすゝめ

アルゴリズムを

                                     学び          実装する

  楽しさ!

Page 27: 20160620 競技プログラミングのすゝめ

競技プログラミング (コンテスト )ができるサイト

・ Topcoder(英語 )

・ Codeforces(英語 )

・ AtCoder(日本語 )

・ yukicoder(日本語 )

Page 28: 20160620 競技プログラミングのすゝめ

練習

                                          まずはとにかく過去問を解く!

前ページのサイトに加え

・ Aizu Online Judge

・ PKU Judge Online

Page 29: 20160620 競技プログラミングのすゝめ

時間の長いコンテスト

一般的にはマラソンマッチと呼ばれる

競技時間は数週間なのでのんびりできる

(基本的には )

最適解が定まらない問題をテーマになるべくスコアの高い回答を出すプログラムを書く