白準2467号です.


白準2467号(溶液)
正の酸性溶液と負のアルカリ性溶液がある場合、問題は、リストされた溶液から2つを選択してゼロに近づけることである.
この問題はダブルポインタで解決できます.リストされた列に一番左と右を指定します.また、2つと0未満の場合は0でなければなりません.そのため、左に1つ押して、0より大きくて、右に1つ引いてください.0の場合は、右から左への値を順番に出力し、プログラムを終了します.
ただし、問題は0の最近値を探すことです.つまり、0は出ないかもしれません.したがって,前に2つの値を加えて終端値を求めた後,既存の和よりも終端値が小さい場合は,結果のresultL,resultRを最新にする論理を追加する必要がある.
#include <bits/stdc++.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n);

	vector<int> v(n + 1);

	int l = 0;
	int r = n - 1;

	for (int i = 0; i < n; i++)
		scanf_s("%d", &v[i]);

	int sum = abs(v[0] + v[n - 1]);
	int resultL = l;
	int resultR = r;

	while (l < r) {
		int tmp = v[l] + v[r];

		if (sum > abs(tmp)) {
			sum = abs(tmp);
			resultL = l;
			resultR = r;
		}

		if (tmp < 0) {
			l++;
		}
		else if (tmp == 0) { // 어차피 0일 경우 위에서 resultL과 resultR이 변경되었을 것이므로 또 처리해줄 필요 없다.
			break;
		}
		else {
			r--;
		}
	}

	printf("%d %d", v[resultL], v[resultR]);

	return 0;
}