Introduction to programming competition [revised]

Preview:

Citation preview

はじめての競技プログラミングOSC名古屋 2011 8/20(土)

@yak_ex / 新 康孝 (CSNagoya)@rofi

発表の流れ

前半 (45分 ):競技プログラミング /サイトの紹介(@yak_ex)

競技プログラミングとは競技プログラミングサイト紹介(含む実演)

後半 (45分 ):問題 /アルゴリズム解説+ α(@rofi)

基本的なデータ構造実際の問題に合わせてアルゴリズム解説競技プログラミングから見た C++0x (@yak_ex)

自己紹介

氏名: 新 康孝 (あたらし やすたか ) Twitter ID: yak_ex Web: http://yak3.myhome.cx:8080/junks

C++ / Perl が主戦場 仕事でコードに触れていないので競技プログラミングで潤い補充TopCoder 1577 / Codeforces 1762

学生時代に ACM/ICPC出場、 1年くらい前に競技プログラミングに復帰

オープンソースと競技プログラミング オープンソース

世界中の開発者のコードが見られる 世界中に潜在的利用者が居る

競技プログラミング 世界中の参加者のコードが見られる 世界中の参加者と腕を競える

もっと被って良さそげなのにいまいちオープンソース界と競技プログラミング界があまり被っ

てなさそげ → 布教

競技プログラミングとは

制限された時間内に与えられた問題を解くためのプログラムを作成、その速さと正確性を競う知的スポーツ

「プログラミングコンテスト」で思い浮かべるテーマに合わせたソフトを応募、審査するコンクール形式とは違って機械的に勝ち負けを判定可能

問題の例

ある東西に伸びたものすごく長い道路にホットドッグ屋がたくさんいます。各ホットドッグ屋は東西 1 m/sで移動できます。初期状態が与えられている時に、どのホットドッグ屋間も最低D m離れている状態になるまで最低何秒かかるでしょうか?(Google Code Jam 2011 Round1B 抄訳 )

1m/s

D m最低何秒かかるか?

問題の例入力例23 20 13 26 12 20 31 1

1m/s

D m最低何秒かかるか?

出力例Case #1: 1.0

Case #2: 2.5

← テストケース数 T←位置の数 C 距離 D←位置 P ホットドッグ屋数 V

C 回繰り返し

T 回繰り返し1 ≤ T ≤ 50

-10 P 10 ≦ ≦ :整数V:正の整数1 D 10 ≦ ≦ : 整数1 C 200 ≦ ≦ : 整数ホットドッグ屋数≦ 10

5 5

6

6 b.cpp

解答例

←問題文にある条件

なぜ競技プログラミング?

白黒はっきりするので目標にしやすい コード自体は複雑にならないので、入門書を終えて次に何やっていいか分からない人に最適?

計算量(時間/空間)の感覚が身につく デバッグ力があがる 他人のソースコードを読む力が付く テストケースを考えられる(コーナーケースが考えられるようになる)

何より楽しい

主な競技プログラミング大会 / サイト TopCoder  ○ Codeforces   ○ Google Code Jam  ○ AOJ(会津大学オンラインジャッジ) ACM/ICPC( ACM国際大学対抗プログラミングコンテスト)

○が付いているサイトについて(練習モードで)実演

TopCoder http://community.topcoder.com/tc 競技プログラミングと言えばまずはここ コンテストは複数種開催されているが競技プログラミングとしては

SRM(Short Round Match) が基本。月 3回程度。 レーティング有り。 Div1 (1200以上 ) / Div2 に分かれていて問題が違う

3問 95 分 / 問題によって最大得点が異なる 典型的には 250, 500, 1000時間に応じて得られる得点が減少していくCoding 75 分→休憩 5分→ Challenge 15分2秒、 64MB制限正誤判定(システムテスト)は競技時間終了後

形式

アクティブ: 8,600 人 1SRM 2,000人強制限参加者数C/C++, C#, Java, VB使用可能言語Java 使用による独自 UIシステム

Codeforces http://www.codeforces.com/ 比較的最近できたロシアの競技プログラミングサイト。月 4回くらい。 以前はよく落ちたりしていたが最近はシステムは安定している 英語が読みにくいと言われることが多い

Gmail、 OpenID でログイン可能 レーティング有り。 Div1 (1650以上 ) / Div2 があるが一括開催だったり片方のみ開催だったり色々

5 問 120 分 / 最大得点が異なり時間に応じて減少

Challenge に相当する Hack が可能だが時間枠が分かれていない

実行時間、メモリ制約は問題毎に明示正誤判定(システムテスト)は競技時間終了後

形式

7,900 人 1Round 1,500人強参加者数

Pascal, C, C++, C++0x, C#, Java, PHP, Python, Ruby, Haskell

使用可能言語Web (Web2.0 による競技 PG サイトを標榜 )システム

Google Code Jam http://code.google.com/codejam/ Google が開催している年に 1度のお祭り 決勝はオンサイトでやる

勝ち抜き制 予選+ 4 回くらい?予選は 24 時間 各問題に対し、データ量等が少ない small input と 多い

large input がある 提出に時間制限あり( small 4 分 / large 8分) 問題、 small or large で得点が異なる small input は即結果判定有りで、時間中に複数回提出可能 large input は一発勝負で結果は競技時間終了後判明 得点と、正答累積時間+ 4分 ×(正答迄の)誤答数で順位付け

形式

13,000人 (2011予選提出者 )参加者数自由使用可能言語Web (ローカルで実行した結果を提出)システム

AOJ(会津大学オンラインジャッジ )

http://judge.u-aizu.ac.jp/onlinejudge/ 日本にあるオンラインジャッジ

オンラインジャッジ:用意された過去問等に対してソースを送信すると自動で正誤を判定してくれるサイト

黙々と練習するのに良い

3,700人参加者数C, C++, Java使用可能言語Webシステム

ACM/ICPC(ACM国際大学対抗プログラミングコンテスト ) http://cm.baylor.edu/welcome.icpc http://icpc2011.ait.kyushu-u.ac.jp/ja/home ACM(アメリカ計算機学会 )主催のプログラミングコンテスト 大学生対象 チーム制で 1チーム 3人、 1PC共用 基本オンサイト

国内予選→アジア予選→決勝4,5時間 7~ 10問程度正答数と、正答累積時間+ 20分 ×(正答迄の )誤答数で順位付け

電子的な事前準備禁止

形式

88カ国、 2,070大学、 8,305チーム (2010)参加者数C, C++, Java使用可能言語

国内予選は Webシステム

実演

TopCoderアカウント登録 SRM登録 SRM(今回は Practice)

Codeforces Round登録 Round(今回は Practice)

Google Code Jam Practice

TopCoder 実演 アカウント登録

http://community.topcoder.com/tc Register Now→on TopCoder→頑張って入力→メール受信→ URL

ref. http://mainly-coding.blogspot.com/2010/02/topcoder.html

SRM登録 (SRM開始 3時間前から ) (Java実行環境インストール ) http://community.topcoder.com/tc Competitions→Algorithm→Single Round Matches (SRM)→Launch

Arena Active Contests→どれか→ Register

SRM Launch Arena まで↑と一緒 実際には Active Contests → Enter Practice は Practice Rooms→SRMs→どれか Challenge は Summary からダブルクリック Practice での System Test は Practice Options → Run System

Test

Codeforces 実演 設定

http://www.codeforces.com/contests 右上の Enter からログイン Settings → Social の Country に入れておくと国別ランキングに集計

※CF / TC日本参加者比較表http://yak2.myhome.cx/misc/cfjp.html

Round登録 (Round開始 24時間前から ) ログインまで↑と同じ Register

Round ログインまで↑と同じ Enter ( 実際には時間になると勝手に Enter 伺いが出る ) Practice は 適当な Round の Enter → Register for Practice Hack は Room からセルをダブルクリック (Practice 不可 ) Hack するためには Lock が必要 Hack されても Lock していなければ再提出が可能

Codeforces の問題状態遷移

PretestPassed

PretestFailed

初期状態

Hacked

System

Test

の壁

Passed System Test

Locked

Failed System Test

After lockhacked

再提出成功

ハックされる

提出成功

提出失敗再提出成功

システムテスト通過

システムテスト通過ならず

ロック

ハックされる

Google Code Jam 実演

事前登録 http://code.google.com/codejam/ 実際には Practice のところで登録が必要

Practice Input ファイルをダウンロードして実行、出力を提出

CUI ツールもできたが未使用なので説明できない実際には時間制限あり Short input はリトライ可能、 Large input はリトライ不可

書籍・コミュニティ

用語集

レーティングが赤い人。殿上人。Red Coder

深さ優先探索Depth-first searchDFS

幅優先探索Breadth-first searchBFS

チャット等で良くある挨拶Good Luck & Have FunGL & HF

出題者による問題の解説Editorial

実行時エラーRuntime ErrorRE

意味原語用語

誤答Wrong AnswerWA

チャット等で良くある挨拶 (‘11/8/20-)動的計画法

Dynamic ProgrammingDP

メモリ制限超過Memory Limit ExceededMLE

実行時間超過Time Limit ExceededTLE

出力形式エラーPresentation ErrorPE

正解ACceptedAC

ご清聴ありがとうございました。

Recommended