姫路 it 系勉強会 vol.6...

82
姫路 IT 系勉強会 Vol. 6 @kakkun61 1/82 プログラミングコンテスト という名の オンラインゲームがあるらしい ガチャはないよ!/ @kakkun61

Upload: kazkuki-oakamoto

Post on 12-May-2015

2.142 views

Category:

Technology


3 download

DESCRIPTION

姫路 IT 系勉強会 Vol.6 https://sites.google.com/site/himejiitstudy/

TRANSCRIPT

Page 1: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 1/82

プログラミングコンテストという名の

オンラインゲームがあるらしい

\ガチャはないよ!/

@kakkun61

Page 2: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 2/82

自己紹介

● 岡本和樹● @kakkun61● 23歳● 大阪府立大学 4回生● へなちょこ競技プログラマー

Page 3: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 3/82

競技プログラミングってだいたいこんなん

● 大きく2つに分けると● 正解のあるプログラムを速く書く● 正解の簡単に求まらない問題の答えのできるだけよいものを求めるプログラムを書く

Page 4: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 4/82

競技プログラミングってだいたいこんなん

● 正解のあるプログラムを早く書く● こっちを中心に解説していきますん

Page 5: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 5/82

正解のあるプログラムを速く書く

● をやってるコンテストは● TopCoder Single Round Match (SRM)● AtCoder Regular Contest (ARC)● CodeChef Short Contest● CodeForces● Google Code Jam● ACM ICPC● など

Page 6: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 6/82

正解のあるプログラムを速く書く

● TopCoder Single Round Match (SRM)● AtCoder Regular Contest (ARC)● ACM ICPC● ぐらいしか参加したことないのでこれらを題材に

Page 7: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 7/82

ARC #3

● AtCoder 社● 慶應大学● 高橋直大● @chokudai

● http://atcoder.com

Page 8: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 8/82

ARC #3

● A 問題 GPA 計算● プログラミング初心者向けの問題● 問題文の通りにコードを書けばいい● 手元のコンピューターで問題を見ていただいた方が見やすいと思う

● http://atcoder.jp/

Page 9: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 9/82

ARC #3 A 問題 GPA 計算

● 高橋君はアメリカに留学しようと考えており、成績表を提出することになりました。

● アメリカ留学の成績表には、学力を測る指標であるGPAを表記する必要があります。

Page 10: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 10/82

ARC #3 A 問題 GPA 計算

● GPAとは各単位に対する評価(A,B,C,D,F)を点数に換算して平均した値で、点数への換算は以下のようになります。

● A評価 → 4 点● B評価 → 3 点● C評価 → 2 点● D評価 → 1 点● F評価 → 0 点

Page 11: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 11/82

ARC #3 A 問題 GPA 計算

● 全てF評価だった場合は、GPAは 0 になります。

● 高橋君の各単位に対する評価をもとにGPAを求めなさい。

Page 12: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 12/82

ARC #3 A 問題 GPA 計算

● 入力● 入力は以下の形式で標準入力から与えられる。

● N● r1r2…rN

● 1 行目は、単位の総数を表す整数 N(1≦N≦100) が与えられる。

● 2 行目には、単位に対する評価を表す N 文字の文字列が与えられる。

● i 文字目の文字 ri は A, B, C, D, F のいずれかである。

Page 13: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 13/82

ARC #3 A 問題 GPA 計算

● 出力● 入力として与えられた単位の評価をもとにしたGPAを標準出力に 1 行で出力せよ。

● 誤差は絶対誤差あるいは相対誤差の少なくとも片方が 10-9 以下であれば許容する。

● なお、最後には改行を出力せよ。

Page 14: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 14/82

ARC #3 A 問題 GPA 計算

といった感じの問題● A-D, F を 1-4, 0 に変換し、平均を求めるだけ

● プログラマーなら誰でもできるはず

Page 15: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 15/82

ARC #3 A 問題 GPA 計算

● 一応、僕の解答

Page 16: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 16/82

ARC #3 A 問題 GPA 計算

Page 17: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 17/82

ARC #3 A 問題 GPA 計算

● え? Haskell 分からない?

Page 18: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 18/82

ARC #3 A 問題 GPA 計算

● しかたないので Java で● main メソッドの中だけ示します

Page 19: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 19/82

ARC #3 A 問題 GPA 計算

Page 20: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 20/82

Haskell やってみない?

● Haskell の方が文字大きくなかった?

Page 21: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 21/82

Haskell やってみない?

Page 22: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 22/82

Haskell やってみない?

Page 23: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 23/82

Haskell やってみない?

● つまりそっちの方が書く量少ないってことだよね

● Java の変数の i とか、和が代入されてない途中の sum とか要らないよね

● 本当にやりたいことを無駄なく書いてるのは Haskell じゃない?

Page 24: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 24/82

Haskell やってみない?

● もしここで● 「今まで C ファミリーの言語でやってきたから」とか

● 「Haskell のコードなんか気持ち悪い」● ってだけで● Haskell を避けるならそれってつまり……

Page 25: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 25/82

Haskell やってみない?

● 老害?

Page 26: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 26/82

Haskell やってみない?

● もちろん Haskell が苦手とするところは多々あるので、それを知っての上でならいいのですが

Page 27: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 27/82

Haskell やってみない?

● このまま Haskell やってもいいのですが、

● この後、実用関数型言語の希望の星 Scala のセッションがあるのでそちらに委ねましょう

● (自分のコードあんまりポイントフリー化できてないし)

Page 28: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 28/82

Haskell やってみない?

● でも、実際、● 新言語習得のときの練習にプログラミングコンテストの簡単な問題は有用だと思う

● 他の人の解答が見られるので、● 「なるほどこう書けば綺麗なのか」● っていうのが多々ある

Page 29: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 29/82

SRM 543 EllysXors

● 素直に解くとダメな問題● 僕は素直に解いて撃墜されました● 撃墜については後ほど

Page 30: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 30/82

SRM 543 EllysXors

● Problem Statement● XOR problems became very popular in TopCoder recently. (If you do not know the bitwise operation XOR, see the Notes section for an explanation.) That's why Elly decided to invent one of her own. Fortunately for you, the one she came up with is quite simple. You are given two longs L and R. She wants you to find the XOR of all numbers between L and R, inclusive.

Page 31: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 31/82

SRM 543 EllysXors

● 要点だけ日本語に訳すと、● L と R を与えるから、● L L+1 ... R ⊕ ⊕ ⊕ を求めよ● ただし、● 1 L, R 4,000,000,000≦ ≦● L R≦

Page 32: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 32/82

SRM 543 EllysXors

● 単純に実装を考えると、● 再帰もしくはループでしょう

Page 33: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 33/82

SRM 543 EllysXors

● しかし、● 再帰

● Stack Overflow (Java)● ループ

● 最大の計算量時に制限時間超過● Time Limit Exceeded (TLE)

Page 34: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 34/82

SRM 543 EllysXors

● 実はこの問題、数学的に簡単にできて、● どんな入力が来ても一定時間で計算できます

● 計算量 O(1) オーダー1

Page 35: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 35/82

SRM 543 EllysXors

● ちなみに再帰もしくはループの実装だと計算量は、2つの数の差に比例するので、

● O(N)

Page 36: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 36/82

SRM 543 EllysXors

● 他にも2乗に比例するなら、 O(N2)● クイックソートなどなら、 O(NlogN)

Page 37: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 37/82

SRM 543 EllysXors

● 話を戻して、数学的に簡単にするとはどうするのか?

● ちょびっと話がややこしくなります

Page 38: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 38/82

SRM 543 EllysXors

● まず● 1 1 = 0⊕● 2 2 = 0⊕● n n = 0⊕

Page 39: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 39/82

SRM 543 EllysXors

● なので● ellysXors(l, r)

● = l l+1 ... r⊕ ⊕ ⊕● = 1 2 ... l-1⊕ ⊕ ⊕● ⊕1 2 ... l-1 l l+1 ... r⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕

Page 40: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 40/82

SRM 543 EllysXors

● ここで● foldXor(n)

● = 1 2 ... n⊕ ⊕ ⊕● とおくと、● ellysXors(l, r)

● = foldXor(l) foldXor(r)⊕

Page 41: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 41/82

SRM 543 EllysXors

(n)10 (n)2 foldXor(n) n 使っ てを って

1 1 1 12 10 11 n+13 11 0 04 100 100 n5 101 1 16 110 111 n+17 111 0 08 1000 1000 n9 1001 1 1

Page 42: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 42/82

SRM 543 EllysXors

(n)10 (n)2 foldXor(n) n 使っ てを って

1 1 1 12 10 11 n+13 11 0 04 100 100 n5 101 1 16 110 111 n+17 111 0 08 1000 1000 n9 1001 1 1

4つごとに周期

Page 43: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 43/82

SRM 543 EllysXors

● この周期を使うと● foldXor(n)

● = 1 (n ≡ 1 mod. 4 のとき)● = n + 1 (n ≡ 2 mod. 4 のとき)● = 0 (n ≡ 3 mod. 4 のとき)● = n (n ≡ 4 mod. 4 のとき)

● ellysXors(l, r)● = foldXor(l) foldXor(r)⊕

Page 44: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 44/82

SRM 543 EllysXors

● よって● ellysXor(l, r) は定数時間 O(1) で求まる

Page 45: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 45/82

ルール説明 ARC

● AtCoder Regular Contest #1, #2, #3 にもとづいて解説

● コンテスト通してのルールの記述が見当たらないので今後変わるかも

● ARC #3 のチュートリアルhttp://arc003.contest.atcoder.jp/tutorial

Page 46: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 46/82

ルール説明 ARC

● AtCoder Regular Contest● 時間 90分● 4問● 難易度順に A-D

Page 47: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 47/82

ルール説明 ARC

● 使用可能言語● C (GCC4.4.6)● C++ (G++4.6.3)● C++ (GCC4.4.6)● C++11 (GCC 4.6.1)● C (GCC4.6.3)● D (DMD 2.058)● Java (OpenJDK 1.6.0)

● C# (Mono 2.10.5)● PHP (PHP 5.3.6)● Python (2.7.2)● Perl (5.12.4)● Ruby (1.9.2)● Haskell (GHC 7.0.3)● Pascal (fpc 2.4.4)● JavaScript (Node 0.6.12)

Page 48: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 48/82

ルール説明 ARC

● Web でテキスト入力欄に書いて提出● Main.(拡張子 )として保存されるので、Java などの場合 Main クラスにする

● 通常のプログラムと同じエントリーポイントから起動される

● 入力および出力は標準入力・標準出力

Page 49: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 49/82

ルール説明 ARC

● コンテストの流れ● コンテスト開始 10分後までに参加登録● 好きな問題を開く

Page 50: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 50/82

ルール説明 ARC

● 解けたら、提出ページでソースコードを貼り付け提出

● 提出するとすぐにシステムがテストを始める

● 結果タブから現在の結果が得られる● 結果は次の通り

Page 51: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 51/82

ルール説明 ARC

● AC: Accepted● WA: Wrong Answer● TLE: Time Limit Exceeded● MLE: Memory Limit Exceeded● CE: Compile Error● RE: Runtime Error● OLE: Output Limit Exceeded● IE: ?

Page 52: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 52/82

ルール説明 ARC

● 順位付け● 各問100点で400点満点● 同点の場合は最終正解提出時間の早さで比べる

● 誤答ペナルティは1回につき15分● ただし、その問題に正解した場合のみ

Page 53: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 53/82

ルール説明 ARC

● コンテスト終了後は全員の解答が見られるようになるので、それで復習してください

Page 54: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 54/82

ルール説明 SRM

● TopCoder Single Round Match● 時間 95分

● コーディング 75分● 休憩 5分● チャレンジ 15分

● 3問● チャレンジが特徴的

Page 55: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 55/82

ルール説明 SRM

● TopCoder Single Round Match● 時間 95分

● コーディング 75分● 休憩 5分● チャレンジ 15分

● 3問● チャレンジが特徴的

Page 56: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 56/82

ルール説明 SRM

● コンテストはアリーナと呼ばれる Java Applet のアプリを使用

● メンバーは Rating と呼ばれるレベルを持っていて、Rating ごとに次のように色分けされる

Page 57: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 57/82

Page 58: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 58/82

ルール説明 SRM

● メンバーは Rating と呼ばれるレベルを持っていて、Rating ごとに色分けされる

Page 59: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 59/82

ルール説明 SRM

● 初参加 白● 0-899 灰● 900-1199 緑● 1200-1499 青● 1500-2199 黄● 2200-2999 赤● 3000- 赤地に白点 ターゲットと呼ばれる

Page 60: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 60/82

ルール説明 SRM

● 初参加 白● 0-899 灰 ←僕ココ しょぼい● 900-1199 緑● 1200-1499 青● 1500-2199 黄● 2200-2999 赤● 3000- 赤地に白点 ターゲットと呼ばれる

Page 61: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 61/82

ルール説明 SRM

● Rating の上位・下位で Div. 1, Div. 2 に分かれ、問題セットが異なる

Page 62: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 62/82

ルール説明 SRM

● 初参加 白● 0-899 灰● 900-1199 緑 ↑ Div. 2● 1200-1499 青 ↓ Div. 1● 1500-2199 黄● 2200-2999 赤● 3000- ターゲット

Page 63: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 63/82

ルール説明 SRM

● 問題は3問あり、それぞれ点数が異なる● Easy 250pts, Normal 500pts, Hard 1000pts

● 各々の問題を開いてから提出するまでの経過時間で得点が決まる

● 250pts の問題なら、開いて即刻提出すれば 250pts もらえるということ

Page 64: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 64/82

ルール説明 SRM

● コーディング (coding phase) 75分● 問題を解いて提出● 提出してもまだ採点されない

● 休憩 (intermission) 5分

Page 65: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 65/82

ルール説明 SRM

● 撃墜 (challenge phase) 15分● このフェーズになると全員の解答が公開される

● 他の人の解答を見て、間違ってると気付いたのがあったら、チャレンジを行なうことができる

Page 66: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 66/82

ルール説明 SRM

● 撃墜 (challenge phase) 15分● チャレンジとは● ある問題にこの入力値を与えれば不正解を出す・ TLEになるなどの入力値を作る

● 提出し実際不正解を出すなどするとチャレンジ成功となり50点加算、相手の得点0点

● 失敗した場合は25点減点

Page 67: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 67/82

ルール説明 SRM

● システムテスト (system test)● 運営の用意した入力セットでテストされ無事通ると点を得られる

● 結果に応じて Rating が上下する

Page 68: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 68/82

ルール説明

● ここまでが、ルール説明で● 次からアルゴリズム入門

Page 69: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 69/82

アルゴリズム入門

● アルゴリズムの比較的理解しやすいものを取り上げよう

● ここからの内容は→見ながら書いた

● プログラミングコンテストするならこの本は必携

Page 70: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 70/82

アルゴリズム入門

● プログラミングコンテストチャレンジブック

● 著者は東大生3人● 秋葉拓哉● 岩田陽一● 北川宜稔

● 通称、蟻本● 世界と戦うことを目標に書いてあるので初級編でかなりお腹いっぱい

Page 71: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 71/82

再帰とメモ化

● フィボナッチ数列を計算する関数を再帰で

Page 72: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 72/82

再帰とメモ化

● 単純な再帰だとかなり遅い

Page 73: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 73/82

再帰とメモ化

fib(10)

fib(9)

fib(8)

fib(8)

fib(7)

fib(7)

fib(6)

Page 74: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 74/82

再帰とメモ化

fib(10)

fib(9)

fib(8)

fib(8)

fib(7)

fib(7)

fib(6)

同じ計算がいくつもある

Page 75: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 75/82

再帰とメモ化

● 1度計算したものを保存しておく● すでに計算したかチェックしてしてあるならそれを返す

● これをメモ化という

Page 76: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 76/82

再帰とメモ化

● コードで書くと

Page 77: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 77/82

深さ優先探索 Depth First Search

● 問題● 整数 a1, a2, ... an が与えられます。その中からいくつか選び、その和をちょうど k にすることができるかを判定しなさい。

● ただし、● 1 ≦ n ≦ 20● -108 ≦ ai, k ≦ 108

Page 78: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 78/82

深さ優先探索 Depth First Search

● 例えば● n = 4● a = {1, 2, 4, 7}

● このとき状態を表す木は次のようになる

Page 79: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 79/82

深さ優先探索 Depth First Search

i = 0sum = 0

i = 1sum = 0

i = 1sum = 1

i = 2sum = 0

i = 1sum = 2

i = 3sum = 2

i = 3sum = 6

+1

+2

+4

+7

+1

a = {1, 2, 4, 7}

Page 80: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 80/82

深さ優先探索 Depth First Search

● コードで表すと

Page 81: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 81/82

深さ優先探索 Depth First Search

Page 82: 姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい

姫路 IT 系勉強会 Vol. 6 @kakkun61 82/82

なんと

● ARC #4 今日 21時● SRM 546 今日 25時● 参加するしかない!