https://www.acmicpc.net/problem/2467
시간 2초, 메모리 128MB
input :
output :
조건 :
입력이 오름차순으로 들어오거나, 두 부분으로 나눌 수 있는 경우엔 투 포인터 부터 생각해보자.
시작점과, 끝점 부터 시작해서 두개를 더한 값에 따라 움직이게 된다.
더한 값의 절대값이 이전보다 작으면 정답을 업데이트 해주는 방식.
더한 값이 양수일 때는 값을 줄여야 하니 값이 큰쪽(오른쪽)의 포인터를 -1 한다.
음수일 때는 값을 늘려야 하니 작은쪽(왼쪽)의 포인터를 +1한다.
import sys
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
start = 0
end = len(data) - 1
ret = [0, 0]
val, flag = 9999999999999, 1
while start < end:
mix = data[start] + data[end]
if abs(mix) < val:
ret = [data[start], data[end]]
val = abs(mix)
if mix > 0:
end -= 1
elif mix < 0:
start += 1
else:
print(data[start], data[end])
flag = 0
break
if flag:
print(ret[0], ret[1])
그리고 값의 범위가 10억이기때문에 최대로 나올수 있는 차이는 20억이라는 것을 알고 있자.