N개의 용액 특성값이 오름차순으로 주어진다. 각 용액은 산성(양수) 또는 알칼리성(음수)이며, 두 용액을 혼합했을 때의 특성값은 두 특성값의 합이다. 0에 가장 가까운 특성값을 만드는 두 용액을 찾아서 그 특성값을 출력한다.
오름차순으로 정렬된 벡터를 이용하여 두 포인터(left, right) 접근법을 사용한다. 왼쪽과 오른쪽 포인터의 합을 구하고, 그 값이 양수인지, 음수인지에 따라 포인터를 조정하며 진행한다.
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdint>
using namespace std;
int N;
vector<int> vec;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N;
vec.resize(N);
for (int i = 0; i < N; i++)
cin >> vec[i];
int left = 0, right = N - 1;
int min = INT32_MAX;
pair<int, int> res;
while (left != right) {
int sum = vec[left] + vec[right];
int sum_abs = abs(sum);
if (sum_abs < min) {
res.first = left;
res.second = right;
min = sum_abs;
}
if (sum > 0)
right--;
else
left++;
}
cout << vec[res.first] << " " << vec[res.second] << endl;
return 0;
}