[백준]/C++
백준 2470번 두 용액 [C++]
경우42
2024. 1. 8. 19:03
반응형
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
#문제 해결 방법
투 포인터를 사용해서
두 값을 선택해서 더한값이 0보다 작다면 start++
0보다 크다면 end-- 를 해서 0과 가장 같은값을 구할 수 있겠지만.. (n)
나는 일단 이분탐색을 생각했고
두 값을 더한값이 0보다 작다면
low = mid +1 해서 더 큰값을 찾고
0보다 크다면 high = mid -1 해서 더 작은 값을 찾는 방식을 사용했다 ( nlogn)
#전체 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> liquids(N);
for (int i = 0; i < N; ++i) {
cin >> liquids[i];
}
sort(liquids.begin(), liquids.end());
int closest = INT_MAX;
pair<int, int> answer;
for (int i = 0; i < N; ++i) {
int target = liquids[i];
int low = 0, high = N - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (mid != i) {
int mix = liquids[mid] + target;
if (abs(mix) < closest) {
closest = abs(mix);
answer = {min(target, liquids[mid]), max(target, liquids[mid])};
}
}
if (liquids[mid] + target < 0) {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
cout << answer.first << " " << answer.second << endl;
return 0;
}
반응형