ABC182の感想

A - twiblr

条件式とBを比較する.

a, b = map(int, input().split())

m = 2 * a + 100
if m > b:
    print(m - b)
else:
    print(0)

B - Almost GCD

 A_iの範囲が小さいので,2以上 max(A)以下の自然数を全探索する.

n = int(input())
a = list(map(int, input().split()))

cnt = 0
for i in range(2, max(a)+1):
    tmp = 0
    for j in range(n):
        if a[j] % i == 0:
            tmp += 1

    if cnt < tmp:
        cnt = tmp
        ans = i

print(ans)

C - To 3

 Nが大きいので,Nをstrにして考える.3の倍数条件は「各桁の和が3の倍数である」ことなので,計算する.あとは余りが 0,1,2 のときで場合分けする.

n = list(input())

if len(n) == 1:
    if int(n[0]) % 3 == 0:
        print(0)
    else:
        print(-1)
    exit()

cnt = 0
for i in range(len(n)):
    cnt += int(n[i])

cnt %= 3
if cnt == 0:
    print(0)
    exit()

tmp = []
for i in range(len(n)):
    if int(n[i]) % 3 == 0:
        continue
    tmp.append(int(n[i]) % 3)

if cnt == 1:
    if 1 in tmp:
        print(1)
        exit()
    else: #tmpに1がない
        if len(tmp) >= 2 and len(n) > 2: 
            print(2)
            exit()
else:
    if 2 in tmp:
        print(1)
        exit()
    else: #tmpに2がない
        if len(tmp) >= 2 and len(n) > 2:
            print(2)
            exit()

print(-1)

if len(tmp) >= 2 and len(n) > 2: は,上のif文でtmpの要素を 1, 2 のどちらかに絞っている.どちらの場合でもtmpから2要素以上除ければ3の倍数となる.

  • cnt = 1のとき → 1 - (2 * 2) = -3  \equiv 0 (mod3)
  • cnt = 2のとき → 2 - (1 * 2)  \equiv 0( mod3)

len(tmp) >= 2だけだとk桁の数字からk桁除いてしまう可能性があるのでlen(n)で防ぐ.

D - Wandering

 A_iの累積和を取って最大値を調べるが,これだけだと移動中に最大値を取る場合を考慮できていないので,次の場合を考える. i (i \leq N)にいる座標を state[i], stateの最大値のindexを jとする.

  •  j != Nの場合
    •  j j + 1 stateの最大値を更新する可能性があるので, state[j]から計算する.
  •  i = Nの場合
    •  j - 1 j stateの最大値を更新する可能性があるので,state[-2]から計算する.

これを場合分け.

n = int(input())
a = list(map(int, input().split()))

if n == 1:
    print(max(0, a[0]))
    exit()

csum = [0]
for i in range(n):
    csum.append(csum[i] + a[i])

state = []
for i in range(n + 1):
    if i == 0:
        state.append(csum[i])
        continue
    state.append(state[i - 1] + csum[i])

m = max(state)
tmp = -float('inf')
m_index = 0
for i in range(len(state)):
    if state[i] == m:
        if i != len(state):
            m_index = i + 1
        else:
            m_index = i

if m_index == len(state):
    tmp = a
    ans_list = [state[-2]]
else:
    tmp = a[:m_index]
    ans_list = [state[m_index - 1]]
for i in range(m_index - 1):
    ans_list.append(ans_list[-1] + tmp[i])

print(max(ans_list))

感想

C, Dはもっと早く解けたので悔しい.JOI本戦までもう1ヶ月くらいなのと,しばらくテストはないので精進します.