Atcoder Beginner Contest 158 振り返り 【Python】
はじめに
AtCoder Beginner Contest 158の振り返りをします。
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セットをしたとき、の答えが全セット数となる。 途中で処理が終わるときに並べてある個数が重要。 (=余り)が青いボールの個数(=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)
制約がなので、最大でも金額が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脳)