[백준/BOJ] 백준 14889번 : 스타트와 링크
2020. 9. 8. 02:58ㆍ알고리즘 문제풀이
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
팀이 나누어지는 모든 경우를 구하여 능력치 차이의 최솟값을 구한다. 팀이 나누어지는 경우는 next_permutation를 통해 구했다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
int board[20][20];
int Solve()
{
int ret = 987654321;
int s_team;
int l_team;
vector<int> select(n, 0);
//링크팀을 나타낼 수 (n/2)만큼 1을 표시한다
for (int i = 0; i < n / 2; i++)
select[i] = 1;
//next_permutation 사용전 정렬
sort(select.begin(), select.end());
do {
s_team = 0;
l_team = 0;
for (int i = 0; i < select.size(); i++)
{
//i번이 스타트팀일때
if (select[i] == 0)
{
for (int j = 0; j < select.size(); j++)
{
if (select[j] == 0)
{
s_team += board[i][j];
}
}
}
//i번이 링크팀일때
else if (select[i] == 1)
{
for (int j = 0; j < select.size(); j++)
{
if (select[j] == 1)
{
l_team += board[i][j];
}
}
}
}
//능력치 차이의 최솟값을 구한다
ret = min(ret, abs(s_team - l_team));
} while (next_permutation(select.begin(), select.end()));
return ret;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int input;
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
cin >> input;
board[i][j] = input;
}
cout << Solve();
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 15683번 : 감시 (0) | 2020.09.08 |
---|---|
[백준/BOJ] 백준 14890번 : 경사로 (0) | 2020.09.08 |
[백준/BOJ] 백준 14503번 : 로봇 청소기 (0) | 2020.09.08 |
[백준/BOJ] 백준 14499번 : 주사위 굴리기 (0) | 2020.09.08 |
[백준/BOJ] 백준 13458번 : 시험 감독 (0) | 2020.09.08 |