일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 빠른 입출력
- 문자열
- 재귀
- BeautifulSoup
- 클래스
- DP
- 이분 탐색
- MST
- 중복 순열
- 백트래킹
- 시뮬레이션
- lis
- 스택
- 우선순위 큐
- 순열
- 메모리풀
- dfs
- 비트마스크
- Knapsack
- 큐
- 그리디
- BFS
- 세그먼트 트리
- 링크드리스트
- SSAFY
- 피보나치 수
- 분할 정복
- 조합
- 완전 탐색
- 크루스칼
- Today
- Total
작심 24/7
[백준] 14889번 스타트와 링크 본문
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
조합 문제의 변형이다.
N에 따라 나눌 수 있는 팀의 경우의 수를 살펴보면
N 팀
2 1 | 2
====================
4 1, 2 | 3, 4
1, 3 | 2, 4
1, 4 | 2, 3
====================
6 1, 2, 3 | 4, 5, 6
1, 2, 4 | 3, 5, 6
1, 2, 5 | 3, 4, 6
1, 2, 6 | 3, 4, 5
1, 3, 4 | 2, 5, 6
1, 3, 5 | 2, 4, 6
1, 3, 6 | 2, 4, 5
1, 4, 5 | 2, 3, 6
1, 4, 6 | 2, 3, 5
1, 5, 6 | 2, 3, 4
====================
... ...
이렇게 맨 첫 번째 값은 고정이고 나머지 값들이 오름차순으로 배열된다는 점에서
이런 수식이 나오게 된다.
백트래킹으로 팀을 나눠준 뒤 구성이 다 될 때마다 능력치를 계산해준 뒤
최솟값을 저장하여 출력한다
#include <iostream>
#include <algorithm>
using namespace std;
int S[20][20] = { 0 }, Min = 100000000;
int team[20] = { 0 }, team_start[10] = { 0 }, team_link[10] = { 0 };
void solution(int N, int current, int cnt) {
if (cnt == N / 2 - 1) { //팀이 다 만들어졌을 경우 팀 분리 후 능력치 계산
int start = 0, link = 0;
for (int i = 0; i < N; i++) {
if (team[i] == 1) { //스타트 팀
team_start[start] = i;
start++;
}
else { //링크 팀
team_link[link] = i;
link++;
}
}
start = 0, link = 0;
for (int i = 0; i < N / 2; i++) {
for (int j = 0; j < N / 2; j++) {
if (i != j) { //능력치 계산
start += S[team_start[i]][team_start[j]];
link += S[team_link[i]][team_link[j]];
}
}
}
Min = min(Min, abs(start - link));
}
else {
for (int i = 1; i < N; i++) {
if (current < i) {
team[i] = 1;
cnt++;
solution(N, i, cnt);
cnt--;
team[i] = 0;
}
}
}
}
int main() {
int N;
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> S[i][j];
}
}
team[0] = 1;
solution(N, 0, 0);
cout << Min;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 1003번 피보나치 함수 (0) | 2020.05.26 |
---|---|
[백준] 4150번 피보나치 수 (0) | 2020.05.26 |
[백준] 14888번 연산자 끼워넣기 (C++, JAVA) (0) | 2020.05.25 |
[백준] 2580번 스도쿠 (0) | 2020.05.25 |
[백준] 9663번 N-Queen (2) | 2020.05.24 |