관리 메뉴

Mini

백준 14921 용액합성하기 c++ // 이분탐색 정석패턴 본문

Algorithm/이분탐색

백준 14921 용액합성하기 c++ // 이분탐색 정석패턴

Mini_96 2024. 3. 26. 00:56

https://www.acmicpc.net/problem/14921

 

14921번: 용액 합성하기

홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당신

www.acmicpc.net

1.의사코드

1. v[i]를 돌면서 -v[i]의 idx를찾는다

2. 정답후보는 idx-1, idx, idx+1이다.

3. 범위쳌 / 자기자신제외 / 정답갱신

 

 

2. 전체코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll ret=200000000+1;
int n;
vector<ll> v;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i=0;i<n;++i){
		ll tmp;
		cin >> tmp;
		v.push_back(tmp);
	}

	sort(v.begin(), v.end());
	//for (auto i : v) cout << i << " ";
	//cout << "\n";

	for (int i = 0; i < n; ++i) {
		ll cur = v[i];
		int idx = lower_bound(v.begin()+i+1, v.end(),-1*v[i]) - v.begin();
		for (int k = -1; k <= 1; ++k) {
			if (idx + k < 0 || idx + k >= n) continue; //범위쳌
			if (idx + k == i) continue; //자기자신제외
			if (abs(ret) > abs(cur + v[idx + k])) { //정답갱신
				ret = cur + v[idx + k];
			}
		}
	}
	cout << ret;
	return 0;
}