어흥

[백준 14746] Closest Pair (C++) 본문

알고리즘/백준

[백준 14746] Closest Pair (C++)

라이언납시오 2021. 4. 28. 16:46
728x90
반응형

문제 링크: www.acmicpc.net/problem/14746

 

14746번: Closest Pair

Your program is to read from standard input. The input consists of four lines. The first line contains two integers, n (1 ≤ n ≤ 500,000) and m (1 ≤ m ≤ 500,000), where n is the number of points in set P and m is the number of points in set Q. In th

www.acmicpc.net

1. 주의할 점

- 두 포인터를 사용하여 해결한다

 

2. 구현

- 각 원소를 P,Q 벡터에 담는다

- P,Q 벡터를 오름차순으로 정렬한다

- 두 포인터를 사용하여 각 집합의 왼쪽부터 오른쪽으로 진행한다

- 두 원소의 차이가 최소가 된다면, minLen을 갱신한다. 만약 두 원소의 차이가 minLen과 같다면 Cnt++한다

- P원소 - Q원소의 값이 양수라면 Q원소를 가리키는 qidx++를 수행하고, 아니라면 pidx++를 수행한다

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
vector<int> p,q;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int a, b, c1, c2,result=0,val;
    cin >> a >> b>>c1>>c2;
    for(int i=0;i<a;i++){
        cin>>val;
        p.push_back(val);
    }
    for(int i=0;i<b;i++){
        cin>>val;
        q.push_back(val);
    }
    sort(p.begin(),p.end());
    sort(q.begin(),q.end());
    int pidx=0,qidx=0,cnt=0, minLen = 9876543210;
    while(pidx<a && qidx<b){
        int diff = p[pidx] - q[qidx];
        int absDiff = abs(diff);
        if(minLen>absDiff){
            minLen = absDiff;
            result = max(result,cnt);
            cnt=1;
        }
        else if(minLen==absDiff){
            cnt++;
        }
        if(diff>0)   qidx++;
        else pidx++;
    }
    cout << minLen+abs(c1-c2)<<" "<<cnt;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 15831] 준표의 조약돌 (C++)  (0) 2021.05.04
[백준 16472] 고냥이 (C++)  (0) 2021.04.29
[백준 2531] 회전 초밥 (C++)  (0) 2021.04.27
[백준 17142] 연구소 3 (C++)  (0) 2021.04.21
[백준 17143] 낚시왕 (C++)  (0) 2021.04.21
Comments