Algorithm
[BOJ][C++] 2473 새 용액
도라프
2022. 7. 11. 03:05
https://www.acmicpc.net/problem/2473
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
int main() {
//iostream과 stdio 버퍼 동기화시켜서 입력 빨리받아오자
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//==============================================
cin>>n;
vector<long long> liquids(n,0);
for(int i = 0; i<n; i++){
cin>>liquids[i];
}
sort(liquids.begin(), liquids.end());
//a,b용액을 이중포문으로 찾고, 마지막 c는 lower_bound를 사용하자.
long long a,b,c;
long long chosen_a, chosen_b, chosen_c;
long long min_abs = 3000000010;
for(int i = 0; i<liquids.size()-2; i++){
a = liquids[i];
for(int j = i+1; j<liquids.size()-1; j++){
b = liquids[j];
//lower_bound
int l,r;
l = j+1; //low
r = liquids.size()-1;
int idx_c = lower_bound(liquids.begin()+l, liquids.begin()+r, -a-b)-liquids.begin();
//l~r사이에 없을때
if(idx_c>liquids.size()-1){
c = liquids[liquids.size()-1];
}
//있으면 idx_c와 idx_c-1중 더 작은거 선택
else if(idx_c>l){
if(abs(a+b+liquids[idx_c])<abs(a+b+liquids[idx_c-1])){
c = liquids[idx_c];
}
else{
c = liquids[idx_c-1];
}
}
//idx_c가 l일때
else{
c = liquids[idx_c];
}
if(min_abs>abs(a+b+c)){
min_abs = abs(a+b+c);
chosen_a = a;
chosen_b = b;
chosen_c = c;
}
}
}
cout<<chosen_a<<" "<<chosen_b<<" "<<chosen_c;
return 0;
}