ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

ABC301 A~D問題をpythonで解く

こんばんは、ぱそきいろです。
久々にABC(Atcoder Beginner Contest)301で4完できたので解説を残しておきます。
atcoder.jp

A問題 Overall Winner

よく考えるともっとシンプルにできそうですが、制約がN<100なのでforでぶん回します。
count()を使おうとしたけど勝ち数が同じ場合を考慮しないといけないので・・・
AとTの回数を数えて、N/2を超えると勝ちが決まります。

N=int(input())
S=input()
a=0
t=0
for i in range(len(S)):
    if S[i]=="A":
        a+=1
    if S[i]=="T":
        t+=1
    if a>=(N/2):
        print("A")
        exit()
    if t>=(N/2):
        print("T")
        exit()
B問題 Fill the Gaps

これも間を埋めるだけです。
tempに数列Aの値を入れていき、最後に入れたものとの差分をインクリメント(デクリメント)しながらappendしていきます。

N=int(input())
a=list(map(int,input().split()))
 
temp=[]
temp.append(a[0])
for i in range(1,len(a)):
    te=temp[-1]
    if te>a[i]:
        for j in range(te-a[i]):
            temp.append(te-(j+1))
    elif te<a[i]:
        for j in range(a[i]-te):
            temp.append(te+(j+1))
    #temp.append(a[i])
 
for i in range(len(temp)):
    print(temp[i],end=" ")
C問題 AtCoder Cards

collections.Counterを使います。
そしてアルファベット26文字で回します。
@は「atcoder」に置き換えられますので、「atcoder」ではなければ数を比較する(ダメならNoで終わる)。
「atcoder」なら@の数を減らしていく。
というのでできます。

atlist=["a","t","c","o","d","e","r"]
 
S=input()
T=input()
 
S=collections.Counter(S)
T=collections.Counter(T)
 
atS = S["@"]
atT = T["@"]
 
for i in range(26):
    if S[chr(ord("a")+i)]==T[chr(ord("a")+i)]:
        continue
    elif chr(ord("a")+i) in atlist:
        if S[chr(ord("a")+i)]>T[chr(ord("a")+i)]:
            atT-=(S[chr(ord("a") + i)] - T[chr(ord("a") + i)])
        if T[chr(ord("a")+i)]>S[chr(ord("a")+i)]:
            atS-=(T[chr(ord("a") + i)] - S[chr(ord("a") + i)])
    else:
        print("No")
        exit()
if atT==atS and atT>=0 and atS>=0:
    print("Yes")
else:
    print("No")
D問題 Bitmask

最初に
「Sの?をすべて1にしてNより小さければその数字が答え」
「Sの?をすべて0にしてNより大きければ-1が答え」
となります。
その後、Sの取りうる値を二分探索すれば答えが出そうです。
一番左の?を1に、それ以外を0してN以下なら1に、N以上なら0に決定。
それを左から順番に?を決めていけば答えが出ます。

S=input()
N=int(input())
Stemp = S
Stemp2 = Stemp.replace("?", "1")

if N >= int(Stemp2,2):
    print(int(Stemp2, 2))
    exit()
 
Stemp2 = Stemp.replace("?", "0")
if N < int(Stemp2,2):
    print(int(-1))
    exit()
 
while True:
    Stemp1=Stemp.replace("?","1",1)
    Stemp0=Stemp.replace("?","0",1)
    Stempx=Stemp1.replace("?","0")
    if N>=int(Stempx,2):
        Stemp=Stemp1
    else:
        Stemp=Stemp0
 
    if Stemp.count("?")==0:
        break
print(int(Stemp,2))
まとめ

久しぶりの4完でレートが上がりました!
一刻も早く緑に戻りたい・・・