Re:ゼロから始める競技プログラミング生活 初心者が少しでも高いパフォーマンスを取るために~ABC154~156感想を添えて~


お久しぶりです。2週間以上投稿しない間にABC154,155,156受けました。
154がCまで解けてパフォーマンスが104、155がBまでで135、156がCまでで354でした。

・・・なかなか厳しいけど、徐々にパフォーマンスは上がってきた。

そして今回はAtCoder初心者の私が計3回のABCを経験して感じた、プログラミング力ではなく、付け焼き刃の技で少しでもパフォーマンスを高くするやり方を偏見多めで書いていきます。

C問題を解き終わるまでのスピードが肝

コンテストが開始する前にもう戦いは始まっています!!その回の難易度にも寄りますが、初心者はC問題までで解き終わることが多い(多分)ので、その辺りに人口が集中します。なのでこのC問題までを早めに解けばそれだけでパフォーマンスが上がります。ABC156のC問題までを25分で解くとパフォーマンスが約600、40分かけて解くと約350、時間ギリギリだと約100です。

ちなみに、15分で解くと800超えます。俗にいう緑パフォです。笑

15分はしんどいですが、Cまでをある程度早く解くことさえ継続できれば初心者でも理論上は茶コーダーになれます。

じゃあどうやって早く解くのかって話ですよね。以下からは私のような初心者がC問題までを早く解くための付け焼き刃のような方法を書いていきます。

入力例を変数に入れてコードテストする

これはとても大事です。
AtCoderは提出したコードが間違っていると5分のペナルティーが課せられます(これがかなり順位に影響する)

「いちいちコードテストなんかしていたら時間ロスするじゃん」と思ったそこのあなた!!
初心者を過大評価しています。

初心者はもちろんコードを書くことに慣れていないのでスペルミスや構文ミスが多いです。
そして提出したコードがREで返ってきてペナルティーを喰らうわけです。

A問題でもちゃんとコードテストすることを強く勧めます。
ちなみに、私はABC154でガンガン提出しまくってペナルティー45分喰らいました。笑

入力例の文章をよく読む

初心者は問題文だけ読んでも何言ってるかわからないです、特にC問題からは。笑
でも入力例の文章を読んでから問題文に戻るとすんなり頭に入ってくることがあります。

問題文を読み返すより早く理解できるためお勧めです。

コピペを使う

これはせこい。笑
でも、少しでもパフォーマンスを上げるためには必要なことです。ここは悪に染まりましょう。笑
特に関数のコピペは出力時の引数を書き換えるだけなのでお勧めです。

そして、コンテストが終わったらしっかりコピペしたコードの中身をじっくり見て勉強しましょう。コピペは知識の前借りです!!

私もABC156で10進数をn進数に変える関数をコピペしたので勉強してきます。笑

ノートに図を描く

C問題は少し数学的なひらめきがないと解けない場合が多々あります。
しかし、これは逆にチャンスです!!ひらめきさえすれば爆速で提出できます。
https://atcoder.jp/contests/abc156/tasks/abc156_c
このABC156のC問題を例にあげると、問題文に最小値がうんたらと書いてあるけど、結局は座標の中点を求めれば良いだけなのでそれさえ気づくことができれば一瞬で解けます。

やることは数学と同じなのでノートに図だったりを色々書いてみることでひらめきの助けになります。


N = int(input())
X = list(map(int,input().split()))
P = sum(X)/len(X)
P = round(P)
count = 0
for i in range(N):
  count += (X[i] - P)**2
print(count)

コードも簡単なので初心者でも検索しながらであればすぐに書けます。本当にひらめきだけです。

こんな得意げに語っておいて私は点Pが整数値だということを忘れていてペナルティー15分喰らったのですが()

最後に

以上がAtCoder初心者が付け焼き刃で少しでも高いパフォーマンスを取る方法を書いてきたのですが、一番言いたいことは「凡ミスを失くそう」です。もうこれに尽きます。

そして、本記事は競技プロブラミング初心者の私が偏見に基づいて書いたものであるため、何か競プロガチ勢の逆鱗に触れるようなことを意図せず書いてしまっていた場合は優しくご指摘くださいm(_ _)m