AtCoder Beginner Contest 329を解いてみた(A,B,C,D,F)
今回はコンテストには参加してないのですが、329の問題を解いてみたので復習がてら書いてみたいと思います。
A - Spread
この問題はやるだけですね、、はい、、
S=input().rstrip()
for i in range(len(S)):
print(S[i],end=" ")
B - Next
この問題はいろんなやり方があると思いますが、制約も特に気にする必要がないのでソートしてsetで重複を削除してもう一度listに直してインデックスを-2で指定してあげれば大丈夫です
N=int(input())
A=sorted(list(map(int,input().split())))
A=list(set(A))
print(A[-2])
C - Count xxx
この問題は、どの文字を最大何文字みたか、というところに焦点を当てて解けば大丈夫だと思います。自分の場合は辞書に格納してあげることで解くことができました。
if(cnt[S[l]]<r-l+1)はS[l]が最大で何文字みられているか、を判定しています。そこでもしr-l+1(今見てる文字数)が大きいならansをインクリメントしてあげます。
最後にS[l]文字が最大で何文字見たか、をcntに記録してあげればいいです。
from collections import defaultdict
N=int(input())
S=list(input().rstrip())
ans=0
cnt=defaultdict(lambda:0)
l,r=0,0
while(r<N):
while(r<N and S[l]==S[r]):
if(cnt[S[l]]<r-l+1):ans+=1
r+=1
cnt[S[l]]=max(cnt[S[l]],r-l)
l=r
print(ans)
D - Election Quick Report
この問題は今誰が何点持っているかを持ってあげればいいです。
もし得点が入った人と現状1位の人のスコアを比べてあげて、もし得点が入った人の得点が現状1位の人のスコアを追い越すようであればその人に更新してあげればいい、もし点数が同じ場合、番号が小さい方を更新してあげればいいです。
N,M=map(int,input().split())
A=list(map(int,input().split()))
now=[-1,-1]
scores=[0]*(N+1)
for i in range(M):
scores[A[i]]+=1
if(now[0]==-1):
now=[scores[A[i]],A[i]]
else:
if(now[0]<scores[A[i]]):
now=[scores[A[i]],A[i]]
elif(now[0]==scores[A[i]] and now[1]>A[i]):
now=[scores[A[i]],A[i]]
print(now[1])
F - Colored Ball
この問題は小さい方を追加する、という手順を行えば解くことができます。これをマージテクというらしいです、、。集合をまとめるときに小さい方を大きい方に移動することでO(logN)に抑えることができるテクニックみたいです。自分はそういうことを意識しないで解いてしまったのでこういう知識が学べてよかったです。
N,Q=map(int,input().split())
C=list(map(int,input().split()))
st=[set() for _ in range(N+1)]
for i in range(N):
st[i+1].add(C[i])
for i in range(Q):
a,b=map(int,input().split())
if(len(st[a])>len(st[b])):
st[a].update(st[b])
st[b].clear()
st[a],st[b]=st[b],st[a]
else:
st[b].update(st[a])
st[a].clear()
print(len(st[b]))
感想
今回はD問題までは早解き対決になった感じがします。(参加してないのでわからないですが、、、)
今回はC,Dでバグらせないで解くことができたので今後も実装力と考察力、知識を身につけ水色に上がれるように頑張りたいと思います。
この記事が気に入ったらサポートをしてみませんか?