-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmistake.html
More file actions
87 lines (63 loc) · 5.03 KB
/
mistake.html
File metadata and controls
87 lines (63 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<title>誤回答のハマリどころ</title>
どうしても詰まった時の、チェックリストみたいな感じに御覧ください。
<a href="http://ichyo.jp/posts/2014-02-15-wrong-answer-bingo/">「プロコンでのWrong Answerの原因」ビンゴ</a>(外部サイト)なども参考に
<dl>
<dt>余計な出力をしない</dt>
<dd>指定された答え以外を出力はしないでください。標準出力には、答えの文字列だけを出力してください。ほとんどのジャッジでは標準エラー出力は単に無視されますが、それが原因でTLEすることがあります。
なお、Aizu Online Judgeでは標準エラー出力に出力するとRE(Runtime Error)扱いになるので特に注意してください。</dd>
<dt>答えの形式が正しいか確認する</dt>
<dd>例えば、<code>YES</code>と答える問題の時に<code>Yes</code>(大文字、小文字のミス)と答えていたり、<code>Impossible</code>をスペルミスしていないか。<br>
たいていは、問題からコピペすれば防げる。(が、面倒だと思ってしまうのでしょうがない。)
</dd>
<dt>配列インデックス外をアクセスしている。</dt>
<dd>-1や配列の長さ以上のインデックスをアクセスしていると、C系の言語だとRange Checkをしないため見つけるのが困難です。<br>
msvcやg++などの場合、vectorやarrayなどを使いSTLのデバッグを有効にすると自動的に検知してくれます。
</dd>
<dt>オーバーフローに気をつける</dt>
<dd>制約的にわかりやすい場合もありますが、気をつけましょう。パスカルの三角形の時は、忘れやすいです。(運営者談)
</dd>
<dt>無効値の初期化に気をつける</dt>
<dd>経路探索などで$\infty$を表すものとして、$-1$や、$1<<20$ などの範囲外の値を使うが、それが計算に巻き込まれないように気をつける。<br>
そもそも無効と思っていたが、計算上あり得る値の可能性もある。
</dd>
<dt>maxの初期値は0でいいですか?</dt>
<dd>存在しなかった時に-1を返し、値として0がありうる問題の時。maxの初期値が-1のほうが良い時もある。<br>
また、最大値がマイナスを取る場合などもある。
</dd>
<dt>変数キャストのミス</dt>
<dd>doubleからintに(もしくは逆など)キャストする際の情報落ちに気をつける。特に暗黙的にキャストされる言語は気をつける。
</dd>
<dt>除算演算子に気をつける</dt>
<dd>上の項目にも近いが、特にPHP,Python3などの除算演算子$/$は int / int であっても double /double と暗黙的にキャストされ演算される。<br>
Python2,3でどちらも使える 除算演算子$//$はintのまま演算ができる。<br>
また、負の値を引数とした除算は言語によって定義が違い、C++などの場合${-x} / {+y}$は0方向への丸めとなるので注意しましょう。(トリビア:C,C++の古いバージョンではこれは処理系定義)
</dd>
<dt>ループ変数の増減のミス</dt>
<dd>よくあるのが2重ループどちらの変数も$i$にしてしまっているとか。</dd>
<dt>for文の中のbreak忘れ</dt>
<dd>特に連続してるものを答える問題で、条件を満たさなくなったらbreakして抜けること</dd>
<dt>ループの範囲に気をつける(off-by-one error)</dt>
<dd>例えば、1~12までの範囲をループしたい時
<pre>for(i=1;i<12;i++) </pre>
ではないことに注意。<br>
<pre>for(i=1;i<=12;i++) </pre>
などが正しい。<br>
特にpythonのrangeは [i,j) なので range(1,13)なことに注意
</dd>
<dt>if文内で、等号のつもりで代入をしてしまっている</dt>
<dd>例えば、aとbが等しいという判定をしたい時、
<pre>if (a=b)</pre>
ではないことに注意。<br>
<pre>if (a==b) </pre>
などが正しい。<br>
前者は代入(式)であるため、aの値とは関係なく、bの値が評価値となってしまう。さらに、aにbの値が代入されてしまう。
</dd>
<dt>C/C++でのmain関数はreturn 0をしてください。</dt>
<dd> 0以外をリターンするとランタイムエラーになります。ただしC++の場合main文に限りreturnを省略できます。</dd>
<dt>PHPのコードは<?php を最初につける</dt>
<dd>これをつけないと、ソースがまるまる出力になってしまいます。</dd>
<dt>制約の見落とし、題意の勘違い</dt>
<dd>問題はきちんと読みましょう。</dd>
<dt>(おまけ?)英文を翻訳かけた</dt>
<dd>翻訳のニュアンスが違っていたりして誤読する場合もあるので、英文を読みましょう。</dd>
</dl>