백준 14889번: 스타트와 링크 / C++

2023. 2. 19. 23:27개인공부/코딩테스트

14889번: 스타트와 링크 (acmicpc.net)
 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

백트래킹 문제로 탐색을 최소화하는 방법을 적용하여 풀이하였다. 

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <vector>
 
using namespace std;
 
int N, Minimum;
bool First = true;
vector<int> arr;
vector<bool>Select;
vector<int> StartTeam;
vector<int> LinkTeam;
 
void CulSynergy()
{
    int S_Team = 0;
    int L_Team = 0;
 
 
    for (auto col = StartTeam.begin(); col != StartTeam.end(); ++col)
    {
        for (auto row = StartTeam.begin(); row != StartTeam.end(); ++row)
        {
            int index = *col * N + *row;
            S_Team += arr[index];
        }
    }
 
    for (auto col = LinkTeam.begin(); col != LinkTeam.end(); ++col)
    {
        for (auto row = LinkTeam.begin(); row != LinkTeam.end(); ++row)
        {
            int index = *col * N + *row;
            L_Team += arr[index];
        }
    }
    int Dif = abs(S_Team - L_Team);
    if(First ==true)
    {
        Minimum = Dif;
        First = false;
    }
    if (Minimum > Dif)
        Minimum = Dif;
    return;
}
 
void DFS(int num , int index)
{
    if (num == N / 2// StarTeam 과 LinkTeam 점수차이 계산
    {
        for (int i = 0; i < N; ++i)
        {
            if (Select[i] == true)
            {
                StartTeam.push_back(i);
            }
            else
            {
                LinkTeam.push_back(i);
            }
        }
        CulSynergy();
        StartTeam.clear();
        LinkTeam.clear();
        return;
    }
    for (int i = index; i < N; ++i)
    {
        if (Select[i] == true
            continue;
        Select[i] = true;
        DFS(num + 1, i+1);
        Select[i] = false;
    }
 
}
 
 
 
int main()
{
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        Select.push_back(false);
    }
    for (int i = 0; i < N * N; ++i)
    {
        int synergy = 0;
        cin >> synergy;
        arr.push_back(synergy);
    }
 
    DFS(0 , 0);
    
    cout << Minimum;
 
    return 0;
}
 
 
cs