はじめに
今週は予定があって不参加でした。あとから解いた。
A
両チームの点数を都度足していって最後に比較すればOK。
A
n = int(input())
tak = 0
aok = 0
for _ in range(n):
x, y = map(int, input().split())
tak += x
aok += y
if tak > aok:
print("Takahashi")
if tak < aok:
print("Aoki")
if tak == aok:
print("Draw")
ちなみに三項演算子のことは忘れていた。
B
拡張ABC文字列は最初はABCいずれの文字も受け付けるが、一度Bが入力された後はBかC、一度Cが入力されたらCしか受け付けなくなる。
という訳で、今がどの状態かを管理しながら一文字ずつ確認していく。
B
s = input()
param = s[0]
for i in range(len(s)):
if param == 'A': #Aなら何もしない、BかCなら次区間へ。
if s[i] == 'B':
param ='B'
if s[i] == 'C':
param ='C'
if param == 'B': #Aならアウト、Bなら何もしない、Cなら次区間へ
if s[i] == 'A':
print("No")
break
if s[i] == 'C':
param = 'C'
if param == 'C': #AかBならアウト、Cなら何もしない
if s[i] == 'A' or s[i] == 'B':
print("No")
break
else:
print("Yes")
なお、初期段階では「初手にいきなりBやCが入力される」「Aの次がいきなりCになる」などを想定できておらず2ペナついてしまった。
また、正規表現を使えば秒殺らしい。
C
やりたいことは明瞭で、「前にいる人の番号」がリストに入っているのでそのインデックスを取得して、取得したインデックスで「前にいる人の番号」を上書きしてまたインデックスを取得して……とやっていけばできる。
C
n = int(input())
A = list(map(int,input().split()))
num = -1
ans = []
for _ in range(n):
value = A.index(num) + 1
ans.append(value)
num = value
print(*ans)
しかし、index()は$O(n)$かかるので全体では$O(n^2)$となりTLEになる。
高速化する方法はいろいろとありそうだけど、{前にいる人の番号:自身の番号}という辞書を作るのが直感的に理解しやすかったのでそうした。取得した値で次に取得するキーを上書きしていけばよい。
C'
n = int(input())
A = list(map(int,input().split()))
d = {}
for i in range(n):
d[A[i]] = i+1 #キーに前に並んでる人、値に人の番号。
ans = []
num = -1
for i in range(n):
ans.append(d[num])
num = d[num]
print(*ans)
辞書はあまり使ったことがなかったが扱いやすくて安心。
参加してたらCまでは解けてたんじゃないかという気がする。来週頑張りましょう。