2
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?

[ABC428] ABC 428(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)

Posted at

[ABC428] ABC 428(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)

A問題

  • 合同(%)を使って、進んだ距離を計算する。
A.py
"""
<方針>
- 合同(`%`)を使って、進んだ距離を計算する。
"""
# 入力
S, A, B, X = map(int, input().split())

# 割ってみる
di, mo = divmod(X, A+B)

# 走る速さX(繰り返した秒数+最後に進んだ秒数)
ans = S*(di*A + min(mo, A))

# 出力
print(ans)

B問題

  • 辞書(defaultdict)を用いて、個数を管理する。
B.py
"""
<方針>
- 辞書(`defaultdict`)を用いて、個数を管理する。
"""
# ライブラリ
from collections import defaultdict

# 入力
N, K = map(int, input().split())
S = input()

# 辞書で管理
di = defaultdict(int)

# 辞書に登録
for i in range(N-K+1):
  di[S[i:i+K]] += 1

# 個数の小ささで並び替えて、辞書順でも並べる
ls_sorted = sorted([(ke, va) for ke, va in di.items()], key=(lambda x: (-x[1], x[0])))

# 最大値を取得
ma = ls_sorted[0][1]
print(ma)

# 上から順番に取り出す
for ke, va in ls_sorted:
  # 個数が最大値と一緒なら、
  if(va == ma):
    # 文字を出力する。
    print(ke)

C問題

方針

  • プラスマイナスの累積和だったりで、良い括弧列かどうかは判定できるが、毎回やっていると、O(Q^2) となってしまう。
  • というわけで、右側からしか操作をしないことを踏まえると、なんとか括弧が右から一個変わるくらいだったら、定数時間で求められないだろうか。
  • そこで、以下の二つの変数を用いる。
    • ) があと何個来たら、良い括弧列になるかを管理する変数 cnt を用いる。
    • また、( が超過して発生したら、そこの場所を記録する変数 ind を用いる。

前提

  • C問題あたりで,TLEになる人は,制約条件を見る癖をつけよう.
  • AB問題では,基本的に制約条件を見ずにやっても解ける.
  • しかし,C問題以降では,制約条件を見ないと必ずTLEすると思っても良い.
  • 詳しい話は私の352回の記事C問題の解説に記したので,是非参照してほしい.
C.py
"""
<方針>
- プラスマイナスの累積和だったりで、良い括弧列かどうかは判定できるが、毎回やっていると、`O(Q^2)` となってしまう。
- というわけで、右側からしか操作をしないことを踏まえると、なんとか括弧が右から一個変わるくらいだったら、定数時間で求められないだろうか。
- そこで、以下の二つの変数を用いる。
  - `)` があと何個来たら、良い括弧列になるかを管理する変数 `cnt` を用いる。
  - また、`(` が超過して発生したら、そこの場所を記録する変数 `ind` を用いる。
"""

ind = None # 先に")"が来てしまい、良い括弧列が崩れたところ
cnt = 0 # 括弧の個数が、良い括弧列を満たすようにバランスが良いかどうか
p = [] # 今の括弧列。長さを取るためだけに存在。

Q = int(input())
for _ in range(Q):
  query = list(input().split())
  match query:
    case ["1", c]:
      p.append(c) # 追加
      cnt -= 1 if(c == ")") else -1 # カウントを変える
      
    case ["2"]:
      c = p.pop() # 削除
      cnt += 1 if(c == ")") else -1 # カウントを変える
  
  # まだ先に")"が来てない時、
  if(ind is None):
    # 先に")"が来てしまった時、
    if(cnt < 0):
      ind = len(p)
  # 先に")"が来てるとき、
  else:
    # ")"を削除した時、
    if(len(p) < ind):
      # 戻す
      ind = None
  
  # 個数がバランスされていて、先に")"が来てない時、
  if((cnt == 0) and (ind is None)):
    print("Yes")
  else:
    print("No")

補足

関係するリンク(参考文献など)

筆者について

その他

  • 間違いを含んでいる可能性があります.
  • 方針と言いつつ,方針ではない感想などを書いている可能性があります.
  • A問題から解説がだんだん省略されます.
  • コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.

最後に一言

  • さみだれを
    • あつめてやばし
      • どなうがわ

この記事書き続けてるけど、意味あるんかな...

2
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
2
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?