初めて参加したAtCoderで惨敗した話

初めて参加したAtCoderで惨敗した話 競技プログラミング




概要

7/21についに初めてatcoderに軽いノリで参戦した。
で、惨敗した。
敗因と対策を書きます。

状況

参戦したのは「AtCoder Beginner Contest 103」
https://beta.atcoder.jp/contests/abc103
100分
言語はnodejsを選択。全4門とも。

結果

順位 1810/2188 位
特典 300/1000点
A :100 :○
B :200 :○
C :300 :×
D :400 :×
3/4クリアできたら上位に行ける感じだった。

敗因

準備 / 情報不足

  • 標準入出力に手間取りロジックを考える時間が奪われてしまったこと。
  • 綺麗に書くことは捨てる
  • 3の問題が時間オーバしてしまう
  • 配列操作に手こずった

3は、
入力値を a b c … とした時


f(X) = (a mod X) + (b mod X) + (c mod X) + …..

で、f(X)が最大になる時のXを求める問題である。
どうしてもタイムオーバしてしまいクリアできず。


X = (a + b + c + ….) – length(a + b + c + ….)

でクリアしている人がおり全く理解できなかった。
とにかく数学的な基礎知識がかけているんだなと思った。

4に関しては、
pup push shift map などの機能を完璧に押さえておけばググる時間を省くことができたんじゃないかな…と思った

と言うわけで

対策

1.標準入出力の処理をテンプレ化する

開始したらとりあえずこれをコピペする。
このフォーマットに沿って書けば問題ないかと

function main(arg) {
// 処理
console.log(arg)
}
main(require('fs').readFileSync('/dev/stdin', 'utf8'));

2.配列操作を完璧にする

これは当たり前ですね…
pup push shift mapあたりは完璧にする。
加えて、jsの場合

arr.sort((a,b) => {
    if (a > b) {
        return 1
    } else {
        return -1
    }
})

で簡単にソートすることができる。
ただ普通のfor whileループ処理で済ませられるなら、それを利用する方が良いはずだ。
実行時間やメモリ消費量を省けるからだ。

3.スニペットを用意しておく

全加算、全乗算、素数判定、ソートとかの頻繁に出てきそうな処理はスニペットにすると良いかと思った。
多分そうやってやっている人もいるんじゃないかな…
GolangでAtCoderの問題を解くためのスニペット集

4.数をこなす

まだまだ問題の傾向がつかめていないところもあるので、
まずは、ある程度ビギナーコンテストに参加して傾向を掴みたいと思う。