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

Preview:

Citation preview

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

spin13

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

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

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

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

問題 A

問題 B

問題 C

問題 D

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

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

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

Judge Server

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

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

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

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

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

例 1

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

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

010001010 010101010

例 1

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

001011101

010101010

答えは7!

×

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

001011101

010101010

101010101

7

2

問題の考察

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

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

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

いやいや .....

2パターンしかない!

答え 1

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

入力

000110101001010101010101

101010101010

用意!

答え 2

000110101001010101010101

101010101010

7

5

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

ans = min(ans, strLeng - ans);

いろいろな解き方がある

解法は1つじゃない!

例 2

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

制約1 N 1000000≦ ≦

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

例 2

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

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

×

例 2

制約1 N 1000000≦ ≦

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

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

例 2

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

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

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

エラトステネスの篩

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

エラトステネスの篩

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

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が素数であることが確定

エラトステネスの篩

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が素数に確定

エラトステネスの篩

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が素数に確定

エラトステネスの篩

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以下の全ての素数が求まった!

素数アルゴリズム

他にも ・ Atkinの篩

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

など色々 ....

アルゴリズムを

                                     学び          実装する

  楽しさ!

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

・ Topcoder(英語 )

・ Codeforces(英語 )

・ AtCoder(日本語 )

・ yukicoder(日本語 )

練習

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

前ページのサイトに加え

・ Aizu Online Judge

・ PKU Judge Online

時間の長いコンテスト

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

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

(基本的には )

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

Recommended