DAMPER's blog

14889 스타트와 링크 본문

Problem Solving/BOJ 문제풀이

14889 스타트와 링크

DAMPER 2021. 1. 2. 02:25
728x90

www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

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

www.acmicpc.net

<아이디어>

N/2 명씩 두팀을 만들기 위해 check vector로 true면 A팀, false면 B팀으로 정합니다.

팀을 이룰 때는 순서에 상관없이 선택합니다.

재귀적으로 팀을 선택한 뒤, 정지조건(N/2명을 골랐을 때)을 만족하면, 팀의 점수를 계산합니다.

점수 계산은 이중 for문으로 완전탐색합니다.

점수차의 최솟값을 계산하여 출력합니다.

 

 

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
#include <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
 
int sum = INT_MAX;
 
void choice(int n, int pos, vector<vector<int>>& v, vector<bool>& check, int k)
{
    if(pos==n/2)
    {
        int asum = 0, bsum = 0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j) continue;
                else if(check[i]==check[j])
                {
                    if(check[i]) asum += v[i][j];
                    else bsum += v[i][j];
                }
            }
        }
        sum = min(sum, abs(asum-bsum));
        return ;
    }
    for(int i=k;i<n;i++)
    {
        if(!check[i])
        {
            check[i] = true;
            choice(n, pos+1, v, check, i+1);
            check[i] = false;
        }
    }
 
}
 
int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);
    int n;
    cin>>n;
    vector<vector<int>> v(n, vector<int> (n, 0));
    vector<bool> check(n, false);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>v[i][j];
 
    choice(n, 0, v, check, 0);
    cout<<sum;
    
 
    return 0;
}
cs

 

728x90

'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글

5525 IOIOI  (0) 2021.01.11
1992 쿼드트리  (0) 2021.01.11
7662 이중 우선순위 큐  (0) 2021.01.08
1541 잃어버린 괄호  (0) 2021.01.05
11687 팩토리얼 0의 개수  (0) 2021.01.04