2016-12-11
競技プログラミングの練習方法について
Competitive Programming Advent Calendar 2016 (その2)の11日目の記事です。
今年、PEAK(超一流になるのは才能か努力か?)という本を読んだ。
練習と能力向上について、
- できないことに挑戦することが大切(惰性で練習してもスキルは上がらない)
- 練習の結果を評価し、改善すること(良いコーチを持つなど)
- 効果的な練習をすることでスキルに特化した脳内イメージができる
というようなことが書かれている。モーツァルトのエピソードなど、なるほどと思うことが多かった。
これを読んで今年はピアノの練習を少し工夫し、前より効果的に練習できた気がしたので、競技プログラミング(以下競プロ)にも適用できたらいいなと思っている。
(以下は思いつきでありまだ実施していない)
PEAKの中で3F(focus、feedback、fix)というのが出てくる。苦手なところを集中して練習し、結果を考察し、悪い部分を直す、というサイクルをまわすとよいという話である。
そのためにはまず苦手なところを見つける必要がある。
SRMのような短時間の競プロの場合、全体としては、問題文や制約条件を理解する→方針を立てる→実装というような流れになる。
それぞれのフェーズについて、
- 問題文の理解の間違いは仕様理解バグ
- 適切な方針やアルゴリズムを選択できていないのは方針バグ
- 正しく実装できていないのは実装バグ
として、自分のSRMのdiv1で結果がどうだったかを分類してみた。SRM526から702まで159回出ていて、期間を3回にわけた。
期間 | 総数 | AC | 実装バグ | 方針バグ | 仕様理解バグ | 未提出 |
SRM526~599 | 57 | 28 (49.12%) | 5 (8.77%) | 9 (15.795%) | 3 (5.26%) | 12 (21.05%) |
SRM600~650 | 50 | 31 (62.00%) | 8 (16.00%) | 8 (16.00%) | 0 | 3 (6.00%) |
SRM651~702 | 52 | 22 (42.31%) | 4 (7.69%) | 10 (19.23%) | 0 | 16 (30.77%) |
全体 | 159 | 81 (50.94%) | 17 (10.69%) | 27(16.98%) | 3 (1.89%) | 31 (19.50%) |
自分の場合は方針バグが多いので、そこを直すべきである。また、実装バグも少なくない。
実装結果は提出記録を見ればよいが、方針については時間がたつと全く思い出せないので、その場なり、直後なりでメモを取って読み返せるようにしたほうがいい。
同僚のhama_duさんが一人Slackをやっているそうで、良さそうなので真似するつもり。
というような感じで、
- 対象を分解する
- 現状を知る
- どこを直せばよいかを見つける
のように、多少意識的に取り組めればいいかなと考えている。来年以降試す予定。
また、全く別の側面として、スキルを上げることだけを目的にすると楽しさが失われがちになるので、続けられるようなバランスでやっていきたい。
(良い練習方法があったらtwitterなどでぜひ教えてほしいです)
明日はzukky162さんと(フライングで公開済ですが)Komakiさんです。
- 143 https://t.co/Gdj7iEgcO3
- 37 http://www.adventar.org/calendars/1625
- 7 https://topcoder-g-hatena-ne-jp.jag-icpc.org/
- 6 https://topcoder-g-hatena-ne-jp.jag-icpc.org/
- 2 https://www.google.com/
- 2 http://matsu7874.hatenablog.com/entry/2016/12/11/125900
- 1 http://twicli.neocat.jp/twicli.html
- 1 http://bit.ly/2higmSt
- 1 https://topcoder-g-hatena-ne-jp.jag-icpc.org/agw/20120524/1337835652
- 1 https://t.co/Gdj7iEgcO3?t=1&cn=ZmxleGlibGVfcmVjcw==&iid=4e403c92a18e41e9b04e046fca906985&uid=3065079840&nid=244+289476616