Algorithm, Data structure/Solved Algorithmic Problem

BAEKJOON 1007 - Vector Matching

JaykayChoi 2016. 7. 23. 00:30

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


만약 (x1, y1), (x2, y2), (x3, y3), (x4, y4)  이란 점들이 있고 이 중

(x1, y1), (x3, y3)을 선택하여 벡터를 만들고 (x2, y2), (x4, y4) 를 선택해 벡터를 만들었다고 할 때,

첫 번째 벡터는 (x1 - x3, y1 - y3) 으로 표현할 수 있고 두 번째 벡터는 (x2 - x4, y2 - y4) 으로 표현할 수 있습니다.

그리고 두 벡터의 합은

(x1 + x2 - (x3 + x4) , y1 + y2 - (y3 + y4)) 이라 할 수 있습니다. 

여기서 만약 x1 + x2 + x3 + x4 를 미리 구해두고

벡터가 되는 점의 한 쪽들을 선택하며 그 점들의 x 좌표들을 구해둔다면

즉 예에서는 x1 + x2 를 구해둔다면 x1 + x2 - (x3 + x4) 을 

x의 전체 합 - 2 * (x1 + x2) 으로 손쉽게 구할 수 있습니다.

위 방법과 n 개의 점에서 n/2 개의 점을 순서에 상관없이 고르는 방법을 통해 해당 문제를 풀었습니다. (가짓수는 이항 계수가 되겠지요)



my solving

c++

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip> 
using namespace std;
typedef long long ll;
 
struct Pos
{
    int x, y;
};
 
int n;
ll _sumX, _sumY;
vector<Pos> points;
 
 
double bruteForce(int start, int remaining, int sumX, int sumY, vector<int>& selected)
{
    if (remaining == 0)
        return sqrt(pow(_sumX - sumX * 22+ pow(_sumY - sumY * 22));
        
    double ret = -1;
    for (int i = start; i <= points.size() - remaining; ++i)
    {
        selected.push_back(i);
        double candidate = bruteForce(i + 1, remaining - 1, sumX + points[i].x, sumY + points[i].y, selected);
        if (candidate < ret || ret == -1)
            ret = candidate;
        selected.pop_back();
    }
    return ret;
}
 
 
int main()
{
    int cases;
    cin >> cases;
 
    for (int i = 0; i < cases; i++)
    {
        points.clear();
        _sumX = _sumY = 0;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            int x, y;
            cin >> x >> y;
            _sumX += x;
            _sumY += y;
 
            Pos pos;
            pos.x = x;
            pos.y = y;
            points.push_back(pos);
        }
 
        vector<int> temp;
        cout << fixed << setprecision(6<< bruteForce(0, n / 200, temp) << endl;
    }
 
    return 0;
}
 
cs


'Algorithm, Data structure > Solved Algorithmic Problem' 카테고리의 다른 글

BAEKJOON 1009 - 분산처리  (0) 2016.07.23
BAEKJOON 1008 - A/B  (0) 2016.07.23
BAEKJOON 1006 - 습격자 초라기  (0) 2016.07.21
BAEKJOON 1005 - ACM Craft  (0) 2016.07.13
BAEKJOON 1004 - 어린왕자  (0) 2016.07.12