アウトプット記録

いろんなことをアウトプットします

AtCoder Beginner Contest 158

やりました。解説というより単なるやったメモ、という感じ。

Pythonしか書けないので全部Pythonです。

A - Station and Bus

全部一緒ならNo、違ったらYes→AとBの数を数えて3ならNo

(解説見ると文字列でとって、1文字目と2文字が同じ かつ 2文字目と3文字目が同じ、でやってますね。スマート…!)

S = list(input())
s_A = [s for s in S if 'A' in s]
s_B = [s for s in S if 'B' in s]

if len(s_A) == 3 or len(s_B) == 3:
    ans = 'No'
else:
    ans = 'Yes'

print(ans)

B - Count Balls

愚直に青赤のセットで割れるものは数を計算して、余ったものは青の長さと比べて足す、とやりました。

後半部はmin(rem,A)でいけたのか…(解説読んだ)

N, A, B = map(int, input().split())
set_blue = A*(N // (A + B))
rem = N % (A + B)

if rem >= A:
    rem_blue = A
else:
    rem_blue = rem

print(set_blue + rem_blue)

C - Tax Increase

最初は方程式の感じで解こうとしましたが、どうもうまくいかず、どうしたものかと考えていたら

1 ≦ A ≦ B ≦100

に目がいき、これなら全数探索でいけるのでは?とやったらいけました。

解説に

最大でも考える必要のある金額は 1009 円であるため 1

とあるので、range(1,1011)とあるのはちょっと計算多いです。

(単に、超えるのはどこだと思って、101 / 0.1 した結果が 1010だったのでそれ使った感じです。ちょっと多い分には問題なさそうですが、あまりに多いとよくないですね)

import math
A, B = map(int, input().split())

for i in range(1, 1011):
    n_a = math.floor(i * 0.08)
    n_b = math.floor(i * 0.1)
    if n_a == A and n_b == B:
        ans = i
        break
    ans = -1

print(ans)

D - String Formation

これはハマりました。。。愚直にやっていたらどう頑張ってもTLEで、文字列の連結を+ではなくlist, joinにしてみたり、depueを使ってみたり、input()を変えてみたり、としていたところで時間切れ。

input()をsys.stdin.readline()に替えてみたら、改行をうまく削除できずに試行錯誤していたら時間足りず、という感じでした。

最後出したやつ(TLE)

S = input()
Q = int(input())
for i in range(1, Q+1):
    query = input()
    if len(query) == 1:
        S = S[::-1]
    else:
        n, F, C = query.split()
        if F == '1':
            s_list = [C, S]
        else:
            s_list = [S, C]
        S = ''.join(s_list)
print(S)

終わってから調べる+解説見ると反転が遅いんですね。。。

問題文の通りに直接シミュレーションするだけでは反転クエリが高速に処理できず、 となり遅いです 2

これなら通りました。

from collections import deque
S = list(input())
Q = int(input())

d = deque()
d.extend(S)
cnt = 0
for i in range(1, Q+1):
    query = input()
    if len(query) == 1:
        cnt += 1
    else:
        n, F, C = query.split()
        if cnt % 2 == 0:  # cntが偶数,F=1で末尾
            if F == '1':
                d.appendleft(C)
            else:
                d.append(C)
        else:  # cntが偶数,F=1で先頭
            if F == '1':
                d.append(C)
            else:
                d.appendleft(C)

if cnt % 2 == 1:  # cnt奇数の場合、反転
    d.reverse()
else:
    pass

l = list(d)
S = ''.join(l)
print(S)

よかったですね。

EとFはちらっと見ただけです。

(同じ注釈を同じ番号でつけたい場合どうすれば良いんだろうか。そもそもそんな使い方は良くない、のか。。。)