0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoderに挑戦してみる(準備編)

Posted at

はじめに

最近、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提出コード
A_Hamming_Distance.py
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提出コード
B_Ranking_with_Ties.py
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回記念ということもあって是非参加(初参加)したい所存です。

なお、準備編と言っていますが、続くかどうかはわかりません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?