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

参考(類題)

atcoder.jp

 

C / AB Substrings

追記)
下記の方針1について分岐が不足していたためWAだった。
ただ、WAのコードを見ると、共通部分と分岐先の計算の整理ができていなかったと思う。 解法としては、

  1. 共通部分として、max(0,x-1)とmin(a,b)を計算する。
  2. x >0 and (a > 0 or b > 0)の場合のみ+1する。(これはx > 1でaかbのどちらかが1以上であるとき、BxxA(カウントはx)の片方が'AB'になってくれるため)

↓@eijitさんに詳しく解説してもらった。

追記おわり)

ジャッジが詰まって、最後の結果はわからずACならずだったが、以下とった戦略である。

  1. 文字列をつなぐところで新しく'AB'になりうるのは「xxA」、「Bxx」、「BxxA」のみである。「xxA」と「Bxx」、「BxxA」はカウント-1で新規に’AB'を作れるので、それを数え上げる。
  2. すべての部分文字列で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

わかんないわかんないわかんない