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.)
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.)
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.)
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.)