誤回答のハマリどころ

Latest Author tubo28 /Date 2016-02-17 16:46:47 / Views 1319
0 (Favした一覧ページは作成中です。)
どうしても詰まった時の、チェックリストみたいな感じに御覧ください。 「プロコンでの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 を最初につける
これをつけないと、ソースがまるまる出力になってしまいます。
制約の見落とし、題意の勘違い
問題はきちんと読みましょう。
(おまけ?)英文を翻訳かけた
翻訳のニュアンスが違っていたりして誤読する場合もあるので、英文を読みましょう。