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)을 업데이트합니다.
마침내 깨끗하게 풀었습니다.
「누적 합을 취한 뒤에, 한번 더 고안한다」라고 하는 곳이 이 문제의 포인트였다고 생각했습니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(AtCoder ABC 182 Python (A~D)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/K_SIO/items/c2e0119957abc9cc1c6c
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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)을 업데이트합니다.
마침내 깨끗하게 풀었습니다.
「누적 합을 취한 뒤에, 한번 더 고안한다」라고 하는 곳이 이 문제의 포인트였다고 생각했습니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(AtCoder ABC 182 Python (A~D)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/K_SIO/items/c2e0119957abc9cc1c6c
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
A, B = map(int, input().split())
max_follow = 2 * A + 100
answer = max_follow - B
print(answer)

답변
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)을 업데이트합니다.
마침내 깨끗하게 풀었습니다.
「누적 합을 취한 뒤에, 한번 더 고안한다」라고 하는 곳이 이 문제의 포인트였다고 생각했습니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(AtCoder ABC 182 Python (A~D)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/K_SIO/items/c2e0119957abc9cc1c6c
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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)

답변(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)을 업데이트합니다.
마침내 깨끗하게 풀었습니다.
「누적 합을 취한 뒤에, 한번 더 고안한다」라고 하는 곳이 이 문제의 포인트였다고 생각했습니다.
Reference
이 문제에 관하여(AtCoder ABC 182 Python (A~D)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/K_SIO/items/c2e0119957abc9cc1c6c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)