AtCoder ABC 182 Python (A~D)

총괄



A, B, C 풀었습니다.
D는 앞으로 한 걸음.
E는 시간 없이 문제문 읽었을 뿐입니다만, 의외로 간단한 문제였으므로, 먼저 E를 풀어도 좋았을지도 모릅니다.

문제



A. twiblr





답변
A, B = map(int, input().split())

max_follow = 2 * A + 100
answer = max_follow - B
print(answer)


이것은 쓸 뿐.

B. Almost GCD





답변
N = int(input())
A = list(map(int, input().split()))

max_gcd = 0
answer = 0
for i in range(2, 1000+1):
    count = 0
    for a in A:
        if a % i == 0 and a >= i:
            count += 1
    if count >= max_gcd:
        answer = i
        max_gcd = count

print(answer)

이것도 기본적으로 쓸 뿐입니다만, B문제로는 구현이 약간 복잡.

C. To 3





답변
from itertools import combinations

N = list(map(int, str(int(input()))))
k = len(N)

for i in reversed(range(1, k+1)):
    for C in combinations(N, i):
        if sum(C) % 3 == 0:
            print(k - i)
            exit()

print(-1)

3의 배수의 숫자는 각 자리수의 합이 3의 배수인지 아닌지를 시도하면 됩니다.
제약적으로 전대로 시험할 수 있으므로, 콤비네이션으로 각 자리수로부터 임의의 수를 선택해 그 합이 3으로 갈라지는지를 시험합니다.

D. Wandering





답변(WA 2개)
import numpy as np

N = int(input())
A = np.array(list(map(int, input().split())))
cumA = np.cumsum(A)
cumA = np.append(cumA, 0)

now = 0
max_list = []
max_point = 0
max_index = 0
for i, cum_a in enumerate(cumA):
    now += cum_a
    if now >= max_point:
        max_point = now
        max_index = i
        max_list.append((max_point, max_index))

use_max_index = []
for point, index in max_list:
    if point == max_point:
        use_max_index.append(index)


answer = 0
for max_index in use_max_index:
    # max_index と max_index+1 を検討して大きいほうを採用する
    # max_indexを使用する場合
    answer_1 = max_point - cumA[max_index-1]
    count = 0
    add_amount = 0
    for i in range(max_index):
        count += A[i]
        add_amount = max(add_amount, count)

    answer_1 += add_amount

    # max?index+1を使用する場合
    answer_2 = max_point
    count_2 = 0
    add_amount_2 = 0
    if max_index <= N-1:
        for i in range(max_index+1):
            count_2 += A[i]
            add_amount_2 = max(add_amount_2, count_2)

        answer_2 += add_amount_2

    answer = max(answer, answer_1, answer_2)

print(answer)

너무 어렵게 생각하고, 코드가 길어져, WA2개 철회할 수 없어.

답변(나중 AC)
N = int(input())
A = list(map(int, input().split()))

cumA = A[:]
for i in range(1, N):
    cumA[i] += cumA[i-1]

max_cumA = cumA[:]
for i in range(1, N):
    max_cumA[i] = max(max_cumA[i], max_cumA[i-1])

now_point = 0
max_point = 0
for i in range(N):
    max_point = max(max_point, now_point + max_cumA[i])
    now_point += cumA[i]

print(max_point)

이 문제는 제약을 생각하지 않으면 간단하지만 계산량을 떨어뜨리는 점에서 어려웠습니다.
계산량을 취하는 방침은 누적 합이라고 하는 것은 곧 알았습니다만, 도중에 곤란해 해 풀리지 않고・・・.

차분하게 생각해 보면,
1. 누적합을 취한다(cumA)
2. 누적합의 각 index까지의 max의 리스트를 취한다(max_cumA)
3. max_cumA를 사용하여 최대 도달 지점(max_point)을 업데이트합니다.

마침내 깨끗하게 풀었습니다.
「누적 합을 취한 뒤에, 한번 더 고안한다」라고 하는 곳이 이 문제의 포인트였다고 생각했습니다.

좋은 웹페이지 즐겨찾기