-
세 용액 - 2473Algorithm/BOJ 2020. 4. 16. 13:081234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071//2473 - 세 용액#include <iostream>#include <algorithm>using namespace std;int N;long long ans;long long arr[5000];long long target;int idx1, idx2, idx3;void init(){ans = 3000000000;cin >> N;for (int i = 0; i < N; ++i)cin >> arr[i];sort(arr, arr + N);}int BS(int left, int right){if(left == right) return left;int mid = (left + right)/2;if(target <= arr[mid])return BS(left, mid);elsereturn BS(mid+1, right);}long long absol(long long a){return (a > 0 ? a : -a);}int find(int idx){if(idx == N-1) return idx;long long lgap = absol(target - arr[idx]);long long rgap = absol(target - arr[idx+1]);if(lgap < rgap) return idx;return idx+1;}int main(){ios_base::sync_with_stdio(0), cin.tie(0);init();for (int i = 0; i < N - 2; ++i)for(int j = i+1; j<N-1; ++j){target = -(arr[i] + arr[j]);int k = BS(j+1, N-1);if(target < arr[k]){if(k-1 != j)k = find(k-1);}elsek = find(k);long long sum = arr[i] + arr[j] + arr[k];if(absol(sum) < ans){ans = absol(sum);idx1 = i, idx2 = j, idx3 = k;}}cout << arr[idx1] << " " << arr[idx2] << " " << arr[idx3];}
cs https://www.acmicpc.net/problem/2473
2473번: 세 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하이다. N개의 용액들의 특성값은 모두 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.
www.acmicpc.net
세 용액
두 개의 용액을 먼저 선택합니다. 두 용액의 특성값을 더하고, 그 합의 부호와 반대되는 값(target)과 가장 비슷한 값을 나머지 영역에서 이분탐색으로 찾아주어 세 개의 용액의 절대값이 가장 작은것을 찾아주면 됩니다.
주의할 점은 이분탐색으로 찾은 idx를 가지는 용액의 특성값이 target보다 크다면 idx-1, idx의 용액중 더 가까운것을 선택해야하고, target이 크다면 idx, idx+1 용액중 더 가까운것을 선택해야 합니다.
'Algorithm > BOJ' 카테고리의 다른 글
비트베리 - 17374 (0) 2020.07.13 사탕 줍는 로봇 - 15892 (0) 2020.07.06 소가 길을 건너간 이유 6 - 14466 (0) 2020.04.01 네트워크 연결 - 3780 (0) 2020.04.01 정점들의 거리 - 1761 (0) 2020.03.30