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
の範囲が小さいので,2以上以下の自然数を全探索する.
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を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 0 (mod3)
- cnt = 2のとき → 2 - (1 * 2) 0( mod3)
len(tmp) >= 2だけだとk桁の数字からk桁除いてしまう可能性があるのでlen(n)で防ぐ.
D - Wandering
の累積和を取って最大値を調べるが,これだけだと移動中に最大値を取る場合を考慮できていないので,次の場合を考える.にいる座標を],の最大値のindexをとする.
- の場合
- → での最大値を更新する可能性があるので,]から計算する.
- の場合
- → での最大値を更新する可能性があるので,]から計算する.
これを場合分け.
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ヶ月くらいなのと,しばらくテストはないので精進します.