誤回答のハマリどころ
Latest Author QCFium /Date 2019-09-08 19:03:51 / Views 11908
どうしても詰まった時の、チェックリストみたいな感じに御覧ください。
「プロコンでのWrong Answerの原因」ビンゴ(外部サイト)なども参考に
- 余計な出力をしない
- 指定された答え以外を出力はしないでください。標準出力には、答えの文字列だけを出力してください。ほとんどのジャッジでは標準エラー出力は単に無視されますが、それが原因でTLEすることがあります。 なお、Aizu Online Judgeでは標準エラー出力に出力するとRE(Runtime Error)扱いになるので特に注意してください。
- 答えの形式が正しいか確認する
- 例えば、
YES
と答える問題の時にYes
(大文字、小文字のミス)と答えていたり、Impossible
をスペルミスしていないか。
たいていは、問題からコピペすれば防げる。(が、面倒だと思ってしまうのでしょうがない。) - 配列インデックス外をアクセスしている。
- -1や配列の長さ以上のインデックスをアクセスしていると、C系の言語だとRange Checkをしないため見つけるのが困難です。
msvcやg++などの場合、vectorやarrayなどを使いSTLのデバッグを有効にすると自動的に検知してくれます。 - オーバーフローに気をつける
- 制約的にわかりやすい場合もありますが、気をつけましょう。パスカルの三角形の時は、忘れやすいです。(運営者談)
- 無効値の初期化に気をつける
- 経路探索などで$\infty$を表すものとして、$-1$や、$1<<20$ などの範囲外の値を使うが、それが計算に巻き込まれないように気をつける。
そもそも無効と思っていたが、計算上あり得る値の可能性もある。 - maxの初期値は0でいいですか?
- 存在しなかった時に-1を返し、値として0がありうる問題の時。maxの初期値が-1のほうが良い時もある。
また、最大値がマイナスを取る場合などもある。 - 変数キャストのミス
- doubleからintに(もしくは逆など)キャストする際の情報落ちに気をつける。特に暗黙的にキャストされる言語は気をつける。
- 除算演算子に気をつける
- 上の項目にも近いが、特にPHP,Python3などの除算演算子$/$は int / int であっても double /double と暗黙的にキャストされ演算される。
Python2,3でどちらも使える 除算演算子$//$はintのまま演算ができる。
また、負の値を引数とした除算は言語によって定義が違い、C++などの場合${-x} / {+y}$は0方向への丸めとなるので注意しましょう。(トリビア:C,C++の古いバージョンではこれは処理系定義) - ループ変数の増減のミス
- よくあるのが2重ループどちらの変数も$i$にしてしまっているとか。
- for文の中のbreak忘れ
- 特に連続してるものを答える問題で、条件を満たさなくなったらbreakして抜けること
- ループの範囲に気をつける(off-by-one error)
- 例えば、1~12までの範囲をループしたい時
for(i=1;i<12;i++)
ではないことに注意。
for(i=1;i<=12;i++)
などが正しい。
特にpythonのrangeは [i,j) なので range(1,13)なことに注意 - if文内で、等号のつもりで代入をしてしまっている
- 例えば、aとbが等しいという判定をしたい時、
if (a=b)
ではないことに注意。
if (a==b)
などが正しい。
前者は代入(式)であるため、aの値とは関係なく、bの値が評価値となってしまう。さらに、aにbの値が代入されてしまう。 - C/C++でのmain関数はreturn 0をしてください。
- 0以外をリターンするとランタイムエラーになります。ただしC++の場合main文に限りreturnを省略できます。
- PHPのコードは<?php を最初につける
- これをつけないと、ソースがまるまる出力になってしまいます。
- 制約の見落とし、題意の勘違い
- 問題はきちんと読みましょう。
- (おまけ?)英文を翻訳かけた
- 翻訳のニュアンスが違っていたりして誤読する場合もあるので、英文を読みましょう。