어흥

[백준 2470] 두 용액 (C++) 본문

알고리즘/백준

[백준 2470] 두 용액 (C++)

라이언납시오 2020. 5. 23. 15:24
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

1. 주의할 점

- 이분탐색으로 접근한다(양 끝에서 시작하는 투 포인터)

- 정렬 이후, 이분탐색을 수행한다

 

2. 구현

- 모든 수를 입력받은 후, 오름차순으로 정렬한다

- Left 포인터를 0, Right 포인터를 Num-1로 설정하고 Al, Ar(출력시킬 정답), Result를 초기화하고 시작한다

- Left 포인터가 Right포인터를 넘지 않을때 까지 While문을 수행하며 서로 가리키는 값을 더하고 절대값을 씌워서 Result의 절대값과 비교한다. 2개를 더한 값이 양수면 R--, 음수면 L++를 수행한다

 

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
long long arr[100001];
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int num;
	cin >> num;
	for (int i = 0; i < num; i++)
		cin >> arr[i];
	sort(arr, arr + num);
	int l = 0, r = num - 1;
	long long val, al = arr[l], ar = arr[r], result = al + ar;
	while (l < r) {
		val = arr[l] + arr[r];
		if (abs(result) > abs(val)) {
			result = val;
			al = arr[l];
			ar = arr[r];
		}
		if (val <= 0) {
			l++;
		}
		else {
			r--;
		}
	}
	cout << al << " " << ar;
	system("pause");
	return 0;
}
728x90
반응형
Comments