알고리즘 풀이/백준

14889번-스타트와 링크

claire 2022. 4. 19. 01:21
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int n;	//총 n 명. n을 반반씩 나눠서 팀을 나눈다. 

int board[25][25];

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];
		}
	}
	vector<int> team(n);
	fill(team.begin() + (n / 2), team.end() , 1);
	int mn = 0x7f7f7f7f;
	do {
		int diff = 0;
		for (int i = 0; i < n-1; i++) {
			for (int j = i + 1; j < n; j++) {
				if (team[i] != team[j])continue;
				if (team[i] == 0)diff += (board[i][j] + board[j][i]);
				else diff -= (board[i][j] + board[j][i]);
			}
		}
		mn = min(mn, abs(diff));
	} while (next_permutation(team.begin(),team.end()));
	cout << mn;
}

next_permutation은 내부 동작으로

현재 나와 있는 수열에서 인자로 넘어간 범위에 해당하는 다음 순열을 구하고 true 반환

다음 순열이 없다면 (= 다음에 나온 순열이 순서상 이전 순열보다 작다면) false 반환.

즉, 이전 수보다 작은 것은 나오지 않는다. 

따라서 next_permutation을 위한 조합을 구할 때는 1을 뒤에 오는 배열을 만들어서 돌려야한다.