LoginSignup
0
0

はじめに

今週は予定があって不参加でした。あとから解いた。

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までは解けてたんじゃないかという気がする。来週頑張りましょう。

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