JOIの予選でエラーが出たときに思い出すべきいくつかのこと

対象読者:次のJOIが初めての競技プログラミングだよー、という人

私が競技プログラミングを始めたのはJOIがきっかけです。(PCKは他に出るメンバーがいなかったので)

普通のプログラミングは、時間にとらわれず自由に書いていたので、時間制限があると、よくあるコンパイルエラーにも焦って時間をロスしたりしたものでした。(結果は予選落ちでしたが)

そういうわけで、私が競技プログラミングを始めた頃によく起こっていたエラーの数々と見なおすべきところをまとめてみました。

関数が見つからないって言われてコンパイルエラーになるんだけど!

  • A. "using namespace std;" ちゃんと書きました?
  • B. "memset()" は or ですよ?
  • C. まさかとは思いますが、ちゃんと #include 書いてますよね?


入力関係でバグってるっぽいんだけど!

  • A. ここに載ってることを頭に入れましょう。

競技プログラミングで陥りやすい言語仕様の罠

  • B. char[] の大きさを、最長の長さ+1にするの忘れてないですよね?

私にはトラウマとなりつつあるので、100文字必要なときは、 char s[110] くらい確保していることもあります。

"floating point exception"っていうのが出た!

っ "0除算"

"segmentation fault"って何!?

  • A. 大きめの配列を関数内(スタック領域)で宣言すると、発生することがあります。

参考になるのはこのあたりでしょうか。
プログラミングコンテストプチテクニック(g++)

  • B. 配列の範囲外参照

0-indexedと1-indexedの勘違いによることもしばしば。
valgrindというメモリデバッガーが非常に役に立ちますが、導入が大変かもしれないですね。
valgrind を使ってみた


余談:なんでみんなコンテスト開催の情報知ってるの?

私はここのカレンダーを、Googleカレンダーにインポートしています。
http://topcoder.g.hatena.ne.jp/

あとがき

時期的にはコレに参加すべきだったかもしれないけど、後の祭りというやつですね。
競技プログラミング関連のAdvent Calendar