[ABC442] ABC 442(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)
A問題
-
countを使うか.
A.py
"""
<方針>
- `count` を使うか.
"""
# 入力
S = input()
# 計算
ans = S.count("i") + S.count("j")
# 出力
print(ans)
B問題
- 音量
volumeと再生playを管理すれば良い.
B.py
"""
<方針>
- 音量 `volume` と再生 `play` を管理すれば良い.
"""
# 状態
volume = 0
play = False
# 入力
Q = int(input())
for _ in range(Q):
# 状態変化
match int(input()):
case 1:
volume += 1
case 2:
volume = max(0, volume-1)
case 3:
play = not play
# 出力
if((volume >= 3) and play):
print("Yes")
else:
print("No")
C問題
方針
- 利害関係がない人が
n(>=3)人いる時,組み合わせは,nC3である. - それぞれの研究者に利害関係があるかどうかは予め求めることができる.
前提
-
C問題あたりで,TLEになる人は,制約条件を見る癖をつけよう. -
AとB問題では,基本的に制約条件を見ずにやっても解ける. - しかし,
C問題以降では,制約条件を見ないと必ずTLEすると思っても良い. - 詳しい話は私の352回の記事 の
C問題の解説に記したので,是非参照してほしい.
C.py
"""
<方針>
- 利害関係がない人が `n(>=3)` 人いる時,組み合わせは,`nC3` である.
- それぞれの研究者に利害関係があるかどうかは予め求めることができる.
"""
# 入力
N, M = map(int, input().split())
AB = [list(map(int, input().split())) for _ in range(M)]
# 利害関係が無い人がそれぞれ何人いるかを求める.
n_rels = [N-1]*(N)
for a, b in AB:
n_rels[a-1] -= 1
n_rels[b-1] -= 1
# nC3を求める
ans = []
for n in n_rels:
# 組み合わせ
if(n < 3):
ans.append(0)
else:
ans.append(n*(n-1)*(n-2)//(3*2*1))
# 出力
print(*ans)
補足
関係するリンク(参考文献など)
筆者について
- Atcoderアカウント
- 今回も不参加のため,成績なし.
- 解説で示したA問題の提出
- 解説で示したB問題の提出
- 解説で示したC問題の提出
その他
- 間違いを含んでいる可能性があります.
- 方針と言いつつ,方針ではない感想などを書いている可能性があります.
- A問題から解説がだんだん省略されます.
- コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.
最後に一言
- 分け合ってブラウザを再インストールしたんだけど,自動テストスクリプトがなぜか入れられない🥺