[Baekjoon] 2467. 溶液[G 5]


質問する📚


https://www.acmicpc.net/problem/2467
これは二重ポインタの問題です.ダブルポインタを使用するには、数値をソートする必要がありますが、ソート後は便利です.
2つの数の合意した節価の最高値が要求されるので、2つの数を合わせると、0より大きい数eは−1より小さく、0より小さい数sは+1に等しい.
次に、5桁の例を示します.
s(start)とe(end)はそれぞれ開始と終了から始まる.sとeを移動するたびに,当時の倹約値を比較して最小の数字を得る.
-9-4235se
s+eは-4です.-9,5のみが表示され、このときの絶対値は現在の最小値で2つの数を格納します.そして-負の数i sを4で右に移動します.eが移動すると、値が小さくなるので、sグリッドを移動します.
-9-4235se
sとeの和は1である.このときの和が以前に記憶していた2つの数の和よりも大きい節の値は、置換することができる.s+eは1なので、eを左に移動します.
-9-4235se
sとeの和は−1である.この場合の和は、交換するかどうかにかかわらず、以前に保存された2つの数の合意した価格に等しい.問題には何でも印刷すると明記されています.そしてs+eは負数なので、sを右に移動します.
-9-4235se
sとeの和は−2である.2つの数字の合議価格は、保存されている2つの数字の合議価格よりも大きいため、変更されません.2つの数の和は負数で、sは右に移動します.sとeが重なると、重複文が閉じます.

📒 コード#コード#

N = int(input())
arr = list(map(int, input().split()))

s = 0
e = N-1

x, y = arr[s], arr[e]
while e - s > 0:
    if abs(arr[s] + arr[e]) < abs(x + y):
        x, y = arr[s], arr[e]
    if arr[s] + arr[e] > 0:
        e -= 1
    else: s += 1
print(x, y)

🔍 結果