diverta 2019 Programming Contest
解答
A / Consecutive Integers
"連続した"値なのでN-(K-1)で良い。
B / RGB Boxes
全探索だが、3重ループは間に合いそうにないので、RとGは全部みて、Bは条件に合うか(非負であることとR,Gを使った残りを割り切れるか=(r,g,b)でちょうどNの組を作れるか)をチェックすればいける。
def solve(R: int, G: int, B: int, N: int): ans = 0 for i in range(0, N+1, R): for j in range(0, N+1, G): x = N - i - j if(0 <= x and x%B == 0): ans += 1 print(ans) return
参考(類題)
C / AB Substrings
追記)
下記の方針1について分岐が不足していたためWAだった。
ただ、WAのコードを見ると、共通部分と分岐先の計算の整理ができていなかったと思う。
解法としては、
- 共通部分として、max(0,x-1)とmin(a,b)を計算する。
- x >0 and (a > 0 or b > 0)の場合のみ+1する。(これはx > 1でaかbのどちらかが1以上であるとき、BxxA(カウントはx)の片方が'AB'になってくれるため)
↓@eijitさんに詳しく解説してもらった。
a と b が等しくて x が非ゼロの場合は xxA と Bxx の間に BA たちを挟み込んで + 1 になります。
— eijit (@eijit) 2019年5月11日
a と b が等しくなくて a か b のどちらかが非ゼロの場合は、余った方の xxA または Bxx と BA たちをつなげて + 1 になります。https://t.co/7GkmUDzLQj
の L.29-30 がこれらを合わせた計算です。
追記おわり)
ジャッジが詰まって、最後の結果はわからずACならずだったが、以下とった戦略である。
- 文字列をつなぐところで新しく'AB'になりうるのは「xxA」、「Bxx」、「BxxA」のみである。「xxA」と「Bxx」、「BxxA」はカウント-1で新規に’AB'を作れるので、それを数え上げる。
- すべての部分文字列でi.count('AC')
def solve(N: int, s: "List[str]"): x = 0; a = 0; b = 0 ans2 = 0 for i in s: ans2 += i.count('AB') if(i[0] == 'B' and i[-1] == 'A'): x += 1 elif(i[-1] == 'A'): a += 1 elif(i[0] == 'B'): b += 1 ##### AC2 #### ans1 = max(0,x-1) + min(a,b) if((a > 0 or b >0) and x > 0): ans1 += 1 print(ans1+ans2) return
D~F
わかんないわかんないわかんない