PS
[백준] 14889번 스타트와 링크 (C++)
-minari-
2024. 10. 21. 10:30
https://www.acmicpc.net/problem/14889
문제 설명
n x n 배열이 주어졌을 때, 두 팀으로 나누어서 두 팀간의 능력치 차가 최소가 되는 경우를 출력하는 문제이다.
i번째와 j번째가 같은 팀이 되었을 때 능력치는 S(i,j) + S(j,i)이다.
주요 로직
1. 비트 마스킹이다.
-> 두 팀을 나누는 모든 경우의 수를 따져야 하므로 비트마스킹으로 경우마다 두 팀의 인원이 같은지 확인하고 능력치를 구하면 된다.
정답 코드
#include <bits/stdc++.h>
using namespace std;
int n,ret=987654321,arr[24][24];
int check(vector<int> v){
int sum = 0;
for(int i=0; i<v.size(); i++){
for(int j=0; j<v.size(); j++){
if(i == j) continue;
sum += arr[v[i]][v[j]];
}
}
return sum;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> arr[i][j];
}
}
for(int i=0; i<(1<<n); i++){
vector<int> v1;
vector<int> v2;
for(int j=0; j<n; j++){
if(i & (1<<j)) v1.push_back(j);
else v2.push_back(j);
}
if(v1.size() == v2.size()){
int tmp1 = check(v1);
int tmp2 = check(v2);
ret = min(ret, abs(tmp1-tmp2));
}
}
cout << ret << "\n";
return 0;
}