はじめに
最近、YouTubeで検索もしていないのに、AtCoder関連の動画がオススメへ表示されるようになりました。
競技プログラミングサイトであるAtCoderの利用を始めました。本日(2025年4月4日)時点でまだレーティングコンテストには参加していません。
今週の進捗などを書いていきたい所存です。
まずはじめに(APG4b)
AtCoderのサイトには、『はじめかた』のページがあります。
ここで『プログラミング言語を学ぶ』という項目があり、APG4b(C++入門 AtCoder Programming Guide for beginners)があったのでまずはここからはじめることにしました。
C++は業務で5年ほどやっていましたが、いかんせん昔の話なので、新たなプログラミング言語を学んでいる感覚を受けました。配列もstd::vectorじゃなくて[]でしたし。
現在は第2章を終えたところです。
次はお試しでバーチャル参加(ABC399)
続いて、まだAPG4bを終えていませんが、試しにAtCoder Beginner Contest 399(ABC399)をバーチャル参加してみました。
お好みの開始時刻から規定時間(ABCなら100分)だけ参加できるというものです。
反面結果がレーティングには反映されませんが、練習という意味では十分でしょう。
結果は、AとBの2問しか解けませんでした。
まだ競技プログラミングに慣れていないというのもあるようです。
APG4bでC++の勉強をしていましたが、今回はPython3(CPy)を使って参加しました。
問題Aは然程難しくありませんでした。
A - Hamming Distance提出コード
ef main() -> None:
N = int(input())
S = input()
T = input()
result = 0
for i in range(N):
if S[i] != T[i]:
result += 1
print(result)
if __name__ == "__main__":
main()
問題Bは愚直過ぎたなあと反省しています。
クールな手段が思いつかず、解説文通りに書いてしまいました。
他の方の解答を見ると、とても短くてクールな解答もありますね……。
B - Ranking with Ties提出コード
def max_score_in_no_rank(N, P, rank) -> int:
high_score = -1
for count in range(N):
if rank[count] < 0 and P[count] > high_score:
high_score = P[count]
return high_score
def quitting(N, rank) -> bool:
result = False
for count in range(N):
if rank[count] < 0:
result = True
return result
def main() -> None:
N = int(input())
P = list(map(int, input().split()))
rank = [-1] * N
r = 1
while quitting(N, rank):
max_score = max_score_in_no_rank(N, P, rank)
k = 0
for count in range(N):
if P[count] == max_score:
k += 1
rank[count] = r
r += k
for count in range(N):
print(rank[count])
if __name__ == "__main__":
main()
出題される問題は流石に一筋縄ではいかないな、という印象です。
とりあえず、ぶっつけ本番からの絶望→退会にはならずに済んだので良しとします。レートもそう簡単には上がらないそうですし。
AtCoder Daily Trainingで練習する
C++の勉強をしつつ、AtCoder Daily Trainingで練習しました。
これは、ABCの過去問題(のうち難度が低い問題)を5問(ALLは9問)を1時間以内(ALLも1時間)に解く、というもので、毎週火水木の夕方〜夜に行われています。
4月1日はパスし、4月2日から参加しました。というか、その存在を知ったのが2日だったというお話。
難易度はEASYを選択しました。まだ未参加ですし。
なお、出題される問題は(EASYの場合)AABBCなのですが、出題記号はABCDEとして出題されます。
4/2 16:00
使用言語はすべてC++です。コードは省略。
- A Edge Checkerで苦戦3ミス。考え方をリセットしてようやくクリア
- B Not Overflow。1ミス。C++だとdouble型にしないとオーバーフローすることを失念
- C Same Name。ノーミス。引っ掛けポイントを上手に回避できた
合計400点(A, B, C)。
D問題はタイムオーバー、E問題は問題文すら見ていません。
今回はA問題でスタックしてしまったのが反省点でしょうか。
誤提出によるペナルティ5分の意味も理解できたので良しとします。
(残り時間が減るのではなく、誤提出1回毎に回答時間が5分追加されます)
4/3 16:30
使用言語はすべてC++です。今回はすべてノーミスでした。コードは省略。
明らかにコーディングが遅いです。競技に不慣れというのはあります。ただ、知命(アラフィフ)という年齢のせいにしたくはないですね……。
- A Alternately。もうちょっと最適化できたかもしれない
- B Move Right。int型で読み込んで10で割ってprintfを使って出力。ちょっと邪道だったか?
- C 3^A。数学が苦手なのかもしれないと思った今日この頃。問題文が理解できず即パスしてDへ
- D Typing。インデックスを用意してwhile文で回して判定、という愚直な手段を採った
- E digitnum。入力と出力の関係性は理解したが、どうするか考える時間が無かった
合計400点(A, B, D)。
数学を再履修せねばいかんなーと思いました。
おわりに:明日(2025年4月5日土曜日)に向けて
明日はABC400ということで、400回記念ということもあって是非参加(初参加)したい所存です。
なお、準備編と言っていますが、続くかどうかはわかりません。