공부기록

백터 매칭 본문

코테/백준

백터 매칭

코타쿠 2021. 4. 18. 17:24
  • 문제

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

 

1007번: 벡터 매칭

평면 상에 N개의 점이 찍혀있고, 그 점을 집합 P라고 하자. 집합 P의 벡터 매칭은 벡터의 집합인데, 모든 벡터는 집합 P의 한 점에서 시작해서, 또 다른 점에서 끝나는 벡터의 집합이다. 또, P에 속

www.acmicpc.net

 

  • 코드
더보기
#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

bool his[20];
int N;
long double res = 400020;

vector<pair<int,int>> points;

void dfs(int cur_idx, int left){

    if(left == 0){
        long double x_val = 0; long double y_val = 0;
        for(int i=0; i<points.size(); i++){
            if(his[i]){
                x_val += points[i].first;
                y_val += points[i].second;
            }else{
                x_val -= points[i].first;
                y_val -= points[i].second;
            }
        }
        long double tmp = (long double)sqrt(x_val*x_val+y_val*y_val);
        if(tmp < res){
            res = tmp;
        }
    }else if(cur_idx < N){
        his[cur_idx] = true;
        dfs(cur_idx+1, left-1);
        his[cur_idx] = false;
        dfs(cur_idx+1, left);
    }

}

int main(){
    int T;
    cin >> T;
    cout.precision(12);
    while(T--){
        cin >> N;
        for(int i=0; i<N; i++){
            int x, y;
            cin >> x >> y;
            points.push_back({x, y});
        }
        dfs(0,N/2);
        cout << fixed <<  res << '\n';

        points.clear();
        for(int i=0; i<20; i++)
            his[i] = false;
        res = 400000;
    }

}
  • 피드백
    • 1시간 반 걸림
    • 처음에는 문제의 설명 그대로 두 점을 매칭시키고 그 것의 방향을 고려해서 짜줬더니 시간초과가 났다.
      • 복잡도는 nCn/2 * (n/2)! * 2^(n/2)가 나올 것... 그냥 시간초과가 남
    • 생각을 해보니 벡터는 Pa - Pb이다. 즉 점의 반 개를 - 부호를 취해줘서 끝에서 합하면 그만
    • 곧 nCn/2의 문제로 변함...  20C10 = 184756 으로 풀 수 있다.
    • 실수로 조합구하는 법을 까먹어서 외부 코드를 참고... 조합은 위처럼 선형으로 구할 수 있다.

 

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

최종 순위  (0) 2021.04.23
캐슬 디펜스  (0) 2021.04.20
성냥개비  (0) 2021.04.18
스타트 택시  (0) 2021.04.14