姫路 IT 系勉強会 Vol.6...

Preview:

DESCRIPTION

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

Citation preview

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

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

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

\ガチャはないよ!/

@kakkun61

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

自己紹介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ARC #3

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

● http://atcoder.com

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

ARC #3

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

● http://atcoder.jp/

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

ARC #3 A 問題 GPA 計算

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

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

姫路 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 点

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

ARC #3 A 問題 GPA 計算

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

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

姫路 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 のいずれかである。

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

ARC #3 A 問題 GPA 計算

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

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

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

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

ARC #3 A 問題 GPA 計算

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

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

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

ARC #3 A 問題 GPA 計算

● 一応、僕の解答

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

ARC #3 A 問題 GPA 計算

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

ARC #3 A 問題 GPA 計算

● え? Haskell 分からない?

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

ARC #3 A 問題 GPA 計算

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

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

ARC #3 A 問題 GPA 計算

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

Haskell やってみない?

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

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

Haskell やってみない?

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

Haskell やってみない?

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

Haskell やってみない?

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

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

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

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

Haskell やってみない?

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

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

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

Haskell やってみない?

● 老害?

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

Haskell やってみない?

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

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

Haskell やってみない?

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

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

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

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

Haskell やってみない?

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

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

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

SRM 543 EllysXors

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

姫路 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.

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

SRM 543 EllysXors

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

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

SRM 543 EllysXors

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

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

SRM 543 EllysXors

● しかし、● 再帰

● Stack Overflow (Java)● ループ

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

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

SRM 543 EllysXors

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

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

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

SRM 543 EllysXors

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

● O(N)

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

SRM 543 EllysXors

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

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

SRM 543 EllysXors

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

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

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

SRM 543 EllysXors

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

姫路 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⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕

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

SRM 543 EllysXors

● ここで● foldXor(n)

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

● = foldXor(l) foldXor(r)⊕

姫路 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

姫路 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つごとに周期

姫路 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)⊕

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

SRM 543 EllysXors

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

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

ルール説明 ARC

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

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

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

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

ルール説明 ARC

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

姫路 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)

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

ルール説明 ARC

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

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

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

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

ルール説明 ARC

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

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

ルール説明 ARC

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

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

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

姫路 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: ?

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

ルール説明 ARC

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

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

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

ルール説明 ARC

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

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

ルール説明 SRM

● TopCoder Single Round Match● 時間 95分

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

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

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

ルール説明 SRM

● TopCoder Single Round Match● 時間 95分

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

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

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

ルール説明 SRM

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

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

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

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

ルール説明 SRM

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

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

ルール説明 SRM

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

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

ルール説明 SRM

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

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

ルール説明 SRM

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

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

ルール説明 SRM

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

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

ルール説明 SRM

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

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

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

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

ルール説明 SRM

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

● 休憩 (intermission) 5分

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

ルール説明 SRM

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

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

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

ルール説明 SRM

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

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

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

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

ルール説明 SRM

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

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

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

ルール説明

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

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

アルゴリズム入門

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

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

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

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

アルゴリズム入門

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

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

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

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

再帰とメモ化

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

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

再帰とメモ化

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

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

再帰とメモ化

fib(10)

fib(9)

fib(8)

fib(8)

fib(7)

fib(7)

fib(6)

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

再帰とメモ化

fib(10)

fib(9)

fib(8)

fib(8)

fib(7)

fib(7)

fib(6)

同じ計算がいくつもある

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

再帰とメモ化

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

● これをメモ化という

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

再帰とメモ化

● コードで書くと

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

深さ優先探索 Depth First Search

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

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

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

深さ優先探索 Depth First Search

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

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

姫路 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}

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

深さ優先探索 Depth First Search

● コードで表すと

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

深さ優先探索 Depth First Search

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

なんと

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

Recommended