반응형
문제 링크 : https://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이 20보다 작거나 같으므로 시간제한에 구애받지않고 완전탐색(브루트포스)이 가능합니다.
스타트와 링크로 잘 나누기만 하면 되는데, 저는 처음에 00001111 식으로 절반으로 나눠 수열을 만들고, next_permutation으로 반복문을 돌았습니다.
최솟값을 구할 때 <climits(limits.h)> 헤더를 추가하면 자료형의 최댓값을 쉽게 가져올 수 있습니다.
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int N;
int S[20][20];
int _min = INT_MAX;
int start_sum, link_sum;
vector<int> v;
scanf("%d", &N);
for (int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
scanf("%d", &S[i][j]);
for (int i = 0; i < N/2; i++) v.push_back(0);
for (int i = 0; i < N/2; i++) v.push_back(1);
do {
start_sum = 0, link_sum = 0;
vector<int> start, link;
for (int i = 0; i < N; i++) {
if (v[i] == 0) start.push_back(i);
else link.push_back(i);
}
for (int i = 0; i < N/2; i++) {
for (int j = i + 1; j < N/2; j++) {
if (i == j) continue;
start_sum += S[start[i]][start[j]] + S[start[j]][start[i]];
link_sum += S[link[i]][link[j]] + S[link[j]][link[i]];
}
}
_min = min(_min, abs(start_sum - link_sum));
} while (next_permutation(v.begin(), v.end()));
printf("%d", _min);
return 0;
}
(개발 환경 : vs code)
반응형
'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글
백준 2661 (좋은 수열) / C++ (0) | 2020.07.16 |
---|---|
백준 15686 (치킨 배달) / C++ (0) | 2020.07.13 |
백준 6603 (로또) / C++ (0) | 2020.07.11 |
백준 9663 (n-Queen) / C++ (0) | 2020.07.10 |
백준 5430 (AC) / C++ (0) | 2020.07.10 |