一つだけWAが取れない。。(AtCoder Beginner Contest 123 D - Cake 123)(Resolved)
なぜが一つだけWAが取れない。さらに通っていないのが入力サンプルに置いてだと思われる。目視自分のプログラムの出力と答えが一致しているが、ジャッジにはそうではないと判断された。以下その提出リンクとスクリーンショット。
間違っていたので、僕が間違っているんだろう。
サンプル1における期待される出力と、自分のプログラムが出力した答えを比較する。
自分の目が腐っていなければ一致してる。
結論s1は入力サンプルではないのだろう。じゃあ何なんだ??smallのs??
もし間違いを発見しらた追記する。
追記用
こちらからテストケースを確認した。
s1は入力サンプルやん!!!!!!
と言うことで結論は自分の目が腐っていたことが証明された。皆さんも自分の視力を確認するために上の二つの出力を見比べてみたらどうだろう。違って見えたらあなたの目は正常だ、安心して欲しい。全く同じに見えた方、、、
僕と同じだ!安心して欲しい!
(2021年12月24日午前3時30分追記)
典型90問を解いている最中似たような事象に遭遇したので、今回は解決できるかもということで再チャレンジ。再び全く同じコードを提出すると。。。
なんと新しくコンパイルエラーの項目が追加されていた!AtCoder運営の人が神過ぎるおかげですね。心の底から感謝m__m
で、問題は異なったsignedness(符号の有無)の整数表現が比較されているということで、、、直しましょう!
同じサンプルでWA。でも光明は見えた気がする。もう少し観察してみよう。というかジャッジサーバーで実行されているコンパイルコマンドを実際にローカルで実行してみればええやん。コマンドはこちら。
g++ -std=gnu++17 -Wall -Wextra -O2 -DONLINE_JUDGE -I/opt/boost/gcc/include -L/opt/boost/gcc/lib -I/opt/ac-library -o ./a.out ./Main.cpp
結果がこちら。
Expected
19
17
15
14
13
12
10
8
In real
6000293339674012778
6000293339674012773
266621001208543
266621001208538
2254836933784
2254836933779
2254835417432
2254835417427
確かに間違っている。さてどこが間違っているんだろうか。
バグ箇所を特定。
- if(d.size() <= k) e = d;
- else {
- sort(d.rbegin(), d.rend());
- vector<ll> sam(d.begin(), d.begin()+k);
- e = sam;
- }
- id = 0;
- rep(i, k) rep(j, z) {
- f[id] = e[i] + c[j];
- id++;
- }
23行目辺り。もし最初のifが実行されるとeにdが代入される。長さはd.size()でk以下である。その場合に8行目のforが実行されると、確実にe[i]で範囲外アクセスになる。その部分を修正し、再提出。
AC!
今回の件から僕が得るべき教訓は、
- サンプルでWAになったとしても動揺しない。
- なるべくサーバーで実行されているコンパイルコマンドを実行する。
- たとえほとんどのテストケースで正しかったとしても、一つでもWAが出たのであれば自分のコードがどこか間違っているので、そのバグ箇所を丁寧に探す。
以上、解決。