tmori’s blog

公開メモ帳くらいの感覚で書いています。技術系多め。日常少なめ。

Atcoder Beginner Contest 158 振り返り 【Python】

はじめに

AtCoder Beginner Contest 158の振り返りをします。

atcoder.jp

A - Station and Bus

3つの文字列SにAとBが混在している場合をYes、それ以外をNoにする。

提出したプログラム

a,b,c=input()
if a=='A' and b=='A' and c =='A':
    print('No')
elif a=='B' and b=='B' and c =='B':
    print('No')
else:
    print('Yes')

改めて考えたら、|S|=3の条件があるのでAAAとBBBをNoにして、それ以外をYesにしたほうが良さげ。

修正後

s = input()
print("No" if s in ['AAA', 'BBB'] else 'Yes')

B - Count Balls

1回の操作を1セットをしたとき、 N // (A+B)の答えが全セット数となる。 途中で処理が終わるときに並べてある個数が重要。  N % (A+B)(=余り)が青いボールの個数(=A)を超えていれば、結果に青いボールの個数を足す。 逆に青いボールの個数が余りを超えていれば、余りの数を答えに足す。

提出したプログラム

N,B,R=map(int,input().split())
process_n = N//(B+R)
amari = N%(B+R)
result = process_n*B

if amari <= B:
    result += amari
else:
    result += B
print(result)

6行目から9行目はresult += min(amari, B)の方が見やすいですね。今後はminを使います。

C - Tax Increase

少数が除算が正しく計算できなくて、試行錯誤したけどあんまり意味はなかったっぽい。とりあえず、バカ正直に計算するプログラムが↓です。

提出したプログラム

a,b=map(float,input().split())
a_tax = a*100//8
b_tax = b*100//10
min_tax = 0

if a_tax <= b_tax:
    min_tax = int(a_tax)
else:
    min_tax = int(b_tax)

r_a_tax = int(min_tax*0.08)
r_b_tax = int(min_tax*0.1)

flag = True
while(flag):
    if r_a_tax == a and r_b_tax == b:
        flag = False
    elif r_a_tax > a or r_b_tax > b:
        print(-1)
        exit()
    else:
        min_tax += 1
        r_a_tax = int(min_tax*0.08)
        r_b_tax = int(min_tax*0.1)

print(min_tax)

制約が 1 \leq A \leq B \leq 100なので、最大でも金額が1009円だから、1円から順番に計算する方が賢い。(参考: 公式解説
こういう計算量を考えてからプログラムに直すのがとても競技プログラミングっぽくていいですね。

他の人のプログラム

A, B = map(int, input().split())
for i in range(1,10000):
  if int(i*0.08)==A and int(i*0.1) == B:
    print(i)
    break
else:
  print(-1)

D - String Formation

文字列の先頭と末尾に追加する際はリストじゃなくて、キューの方がいいと基本情報技術者試験のデータ構造とアルゴリズムでやった気がする。なので素直にpythonのcollections.dequeを使いました。 前後反転した際の先頭に追加と、反転していないときの末尾に追加が同じだと気がつければ反転処理を減らすことができますね。しかし、最後の前後反転を忘れないようにしましょう(←1回WAしました)

提出したプログラム

from collections import deque
s = input()
q = int(input())
result_q = deque(s)
t = False
for _ in range(q):
    List=[i for i in input().split()]
    if List[0] == '1':
        if t:
            t = False
        else:
            t = True
    else:
        if List[1] == '1': # F=1
            if t: # 反転時
                result_q.append(List[2])
            else:
                result_q.appendleft(List[2])
        else:
            if t: # 反転時
                result_q.appendleft(List[2])
            else:
                result_q.append(List[2])
if t:
    result_q.reverse()
for s in list(result_q):
    print(s, end="")

終わりに(余談)

レート戦たまらねえ(LoL脳)