알고리즘 문제/[백준]

[백준] 1007 벡터 매칭

latter2005 2021. 4. 8. 00:52
 

1007번: 벡터 매칭

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

www.acmicpc.net

문제 확인

 

벡터의 특성과 벡터를 선택하는 조합 문제입니다.

 

풀이

 

문제에서 주의해야 할 점은 벡터의 합의 길이이므로 (0, 10), (0, -10) 벡터의 합은 (0, 0)이므로 길이는 0이 됩니다.

따라서 벡터의 합을 구할 때 단순히 sqrt((x1 - x2)^2 + (y1 - y2)^2)로 구하면 틀리게 됩니다.

 

전체 벡터 합을 구한 후 선택한 벡터들의 차를 이용하여 벡터의 합을 빠른 시간에 구할 수 있습니다.

(x1, y1), (x2, y2) ... (x10, y10)

total = (x1 + x2 + ..+.. + x10, y1 + y2 + .. + y10) => N/2개 선택 : total - (v ...)

= (x1 + x2 .. x5 - x6 - x7 .. x10(y1 + y2 .. x5 - y6 - y7 .. y10)

해당 과정을 조합을 구하는 dfs를 통해 뺄 점들을 N/2개 선택하면 됩니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <cmath>
 
typedef struct pir {
    int x, y;
};
pir ary[20], total;
int n;
double mn;
void dfs(int cur, int idx, int x, int y) {
    if (cur) {
        for (int i = idx; i <= n - cur; i++)
            dfs(cur - 1, i + 1, x + ary[i].x, y + ary[i].y);
        return;
    }
    double t = sqrt(pow(total.x - (x << 1), 2+ pow(total.y - (y << 1), 2));
    if (t < mn)mn = t;
 
}
 
int main() {
    int t;
    scanf("%d"&t);
 
    while (t--) {
        total = {}; mn = 1e308;
        scanf("%d"&n);
        for (int i = 0; i < n; i++) {
            scanf("%d%d"&ary[i].x, &ary[i].y);
            total.x += ary[i].x;
            total.y += ary[i].y;
        }
        dfs((n >> 1- 11, ary[0].x, ary[0].y);
        printf("%.7lf\n", mn);
    }
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 17140 이차원 배열과 연산  (0) 2021.04.13
[백준] 14890 경사로  (0) 2021.04.08
[백준] 17833 원판 돌리기  (0) 2021.03.30
[백준] 16719 ZOAC  (0) 2021.03.30
[백준] 19237 어른 상어  (0) 2021.03.28