Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21085

Pythonで毎日AtCoder #33

$
0
0

はじめに

前回
今日はAtCoder ProblemsのBoot camp for Beginnersを埋めていきます。難易度はMediumです。

#33

AGC029-A
1TLE

考えたこと
難しい。操作を行なうとBとWが入れかわります。最終的に、左にWが右にBが集まることになります。$W_i(1\leq i\leq N)$が左に行くためには、そのWよりも左にある全てのBに対して操作をしなければなりません。ですので、$W_i(1\leq i\leq N)$の左にあるBの数を足していけば正解です。

s=list(input())ans=0count_b=0n=len(s)foriinrange(n):ifs[i]=='B':count_b+=1ifs[i]=='W':ans+=count_bprint(ans)

ABC139-D
1WA

考えたこと
余りに関する問題です。$N$までの整数を並びかえた数列$P$に対して、$i(1\leq i \leq N$を$P_i$で割ったときの余りの合計の最大値を求めます。$P$は$N$までの整数が昇順で並んでいると考えます。そのまま操作を行うと余りの合計は0になります。$P$を右に一つずらすと$N-1$になります。$i$に対して$P_i$が1だけ小さいからです。ということは左にずらした時に余りの合計が最大になることが分かります。なぜなら、左にずらすと$i$に対して$P_i$が1だけ大きくなります。すると$i \% P_i = i$になります。$P_i=1$にだけ余りが0になることに注意すると、余りの合計は$\frac{N(N-1)}{2}$になります。詳しい証明は解説に載っています。

n=int(input())print(n*(n-1)//2)

まとめ

最近、精進不足なので明日のABCが不安です。ではまた、おやすみなさい。


Viewing all articles
Browse latest Browse all 21085

Trending Articles