2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
이분 탐색이지만, 탐색하는데 N만큼의 연산을 해야하는 문제인것 같다.
용액들을 모두 정렬시켜 놓은 뒤 left = 0, right = N-1로 설정한뒤 두 용액을 더한 값이 0보다 크다면 right--, 0보다 작다면 left++하면서 최솟값을 찾아주자. 주의할점은 단순히 크기 비교가 아니라 절댓값을 사용해야 한다는 점.
#include <cstdio>
#include <algorithm>
using namespace std;
long long int absss(long long int a){
if(a<0)
return -a;
return a;
}
bool comp(long long int a, long long int b){
return a<b;
}
int main(void){
long long int N, array[100001], ans;
scanf("%lld", &N);
for(int i=0; i<N; i++)
scanf("%lld", &array[i]);
sort(array, array+N, comp);
int left = 0, right = N-1, cnt1 = left, cnt2 = right;
ans = absss(array[left]+array[right]);
while(left<right){
if(ans>absss(array[left]+array[right])){
ans = absss(array[left]+array[right]);
cnt1 = left;
cnt2 = right;
}
if(array[left]+array[right] > 0)
right--;
else if(array[left]+array[right] < 0)
left++;
else
break;
}
printf("%lld %lld",array[cnt1],array[cnt2]);
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 2096번] 내려가기 (Gold 4) (0) | 2020.09.13 |
---|---|
[C/C++ 백준 9084번] 동전 (Silver 1) (0) | 2020.09.11 |
[C/C++ 백준 2166번] 다각형의 면적 (Gold 5) (0) | 2020.09.09 |
[C/C++ 백준 1493번] 박스채우기 (Gold 5) (0) | 2020.09.09 |
[C/C++ 백준 5904번] Moo 게임 (Silver 2) (0) | 2020.09.08 |