article thumbnail image
Published 2022. 1. 19. 16:32

벡터 매칭

문제 링크

http://icpc.me/1007

 

1007번: 벡터 매칭

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

www.acmicpc.net

풀이

수학 문제다.

(a, b), (c, d) 점이 있을 때, (a-c, b-d) 또는 (c-a, d-b)인 두 벡터로 만들 수 있다.

위와 같은 성질을 이용하면 모든 점들 중 반절을 -를 곱하여 모두 더한 후 길이의 최솟값을 구하면 된다.

코드

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;

bool positive[22];
vector<pll> v;
ll ans = 1e12;
int n; 

ll calc() {
    ll a = 0, b = 0;
    for (int i = 0; i < n; i++) {
        if (positive[i]) {
            a += v[i].first;
            b += v[i].second;
        } else {
            a -= v[i].first;
            b -= v[i].second;
        }
    }
    return a * a + b * b;
}

void solve(int cur, int p) {
    if (cur == n) {
        if (p == n / 2) ans = min(ans, calc());
        return;
    }
    positive[cur] = true;
    solve(cur + 1, p + 1);
    positive[cur] = false;
    solve(cur + 1, p);
}

int main() {
    int t; cin >> t;
    while (t--) {
        memset(positive, false, sizeof(positive));
        v.clear();
        ans = 1e12;
        cin >> n;
        for (int i = 0; i < n; i++) {
            int a, b; cin >> a >> b;
            v.push_back({a, b});
        }
        solve(0, 0);
        printf("%.6lf\n", sqrt(ans));
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 2096 내려가기  (1) 2022.01.25
[백준] 3653 영화 수집  (0) 2022.01.19
백준[14942] 개미  (0) 2022.01.19
백준[13549] 숨바꼭질 3  (0) 2022.01.18
백준[1865] 웜홀  (0) 2022.01.18
복사했습니다!