AtCoder Beginner Contest 401 - AtCoder 振り返り
ABCの3問解答で、レーティングはまたも下がってしまい、ギリギリ緑色に留まれました。あと-2になったら茶色になります。
今回の反省点は、C問題の意味がわからず、入力例3の答えが出なくて時間がかかってしまった。といった感じです。
D問題は丁寧に場合分けすれば解けたようですけど、これもちょっと難しかったですね...。DPとかで解けたのだろうか。
A - Status Code
文字列の先頭の文字が "2" かどうかで判定します。今回は最初の1文字だけを見ればいいので、入力値は整数に変換したりせず、文字列のままにしました。
S = input()
print("Success" if S[0] == "2" else "Failure")
B - Unauthorized
ログイン状態を変数 login
に記録するようにします。
あとは、S == "private"
かつ login == False
のときの回数を数えればokです。
N = int(input())
login = False
count = 0
for i in range(N):
S = input()
if S == "login":
login = True
elif S == "logout":
login = False
elif S == "private" and login == False:
count += 1
print(count)
C - K-bonacci
問題の条件の数式がよくわからず。入力例1がフィボナッチ数列だったため、「単純にフィボナッチ数列を求めるってこと?」みたいな感じで、問題を誤解していた。
問題タイトルが K-bonacci とある通り、K この数を足し合わせた数列にしなければならない。
たとえば K = 3 なら
A = [1, 1, 1, 3, 5, 9, 17 ....] となる。
自分の直前の K 個分の数を足す。
意味がわかってしまえば簡単で、両面キューを使って K 個分の数をキューに保存するようにすれば良い。キュー内の値の合計は que_total に入れておき、右側に追加したとき・左側から削除したときに、それぞれ足したり引いたりした。
N, K = map(int, input().split())
que = deque()
que_total = 0
for i in range(N + 1):
if i < K:
# 1 をキューに追加
que.append(1)
que_total += 1
else:
# 次の数はキュー内の数の合計値
que.append(que_total)
que_total += que_total
# 左側の数をキューから削除
deleted = que.popleft()
que_total -= deleted
que_total %= mod
print(que[-1] % mod)