코딩테스트/백준
[백준] 23023 - 서프라이즈
rlatotquf45
2024. 11. 17. 15:17
728x90
반응형
문제 링크
https://www.acmicpc.net/problem/23032문제 요약
- 연속된 학번의 학생 구간을 선택하고 두 그룹으로 나눠 각 그룹의 스테이크 무게 합의 차 E를 계산합니다.
- E가 최소가 되는 두 그룹의 스테이크 무게 합이 가장 큰 경우를 찾습니다.
- 해당 경우의 스테이크 무게 합을 출력합니다.
푼 방법
- 누적합 계산: presum 배열을 만들어 스테이크 무게의 누적합을 저장하여 특정 구간의 합을 빠르게 구합니다.
- 구간 선택 및 이진 탐색:
- 두 그룹의 스테이크 무게 합 차이를 최소화하기 위해 이진 탐색을 사용하여 구간의 중간 지점을 조절합니다.
- EE가 최소인 경우를 찾으면서, 만약 EE가 동일하면 두 그룹의 무게 합이 최대인 경우를 선택합니다.
정답 코드
import sys
n = int(sys.stdin.readline().rstrip())
steaks = [0] + list(map(int, sys.stdin.readline().split()))
presum = [0] * (n+1)
for i in range(1, n+1):
presum[i] = presum[i-1] + steaks[i]
minE=float('inf')
ans = 0
for i in range(1, n+1):
for j in range(i+1, n+1):
l = i
r = j
while l<=r:
mid = (l+r)//2
lsum = presum[mid] - presum[i-1]
rsum = presum[j] - presum[mid]
E = abs(lsum - rsum)
if E < minE or (E == minE and lsum+rsum > ans):
minE = E
ans = lsum + rsum
if lsum == rsum:
break
elif lsum < rsum:
l = mid+1
else:
r = mid-1
print(ans)
728x90
반응형