μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€_14889_μŠ€νƒ€νŠΈμ™€ 링크(브루트포슀-μˆœμ—΄)

shj718 2022. 5. 10. 16:45

🌿문제: 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

 

πŸŒΏμ•Œκ³ λ¦¬μ¦˜: 브루트포슀 - μˆœμ—΄ (이 λ¬Έμ œλŠ” μž¬κ·€, λΉ„νŠΈλ§ˆμŠ€ν¬λ‘œ ν’€μ–΄λ³Έ 적이 μžˆλŠ”λ° μˆœμ—΄λ‘œλ„ ν’€ 수 μžˆλ‹€.)

πŸ‘‰μ•„μ΄λ””μ–΄: λ²‘ν„°μ˜ μΈλ±μŠ€κ°€ 각 μ„ μˆ˜λ“€μ„ λ‚˜νƒ€λ‚Έλ‹€κ³  ν•  λ•Œ, team1이면 0, team2이면 1을 κ°’μœΌλ‘œ κ°€μ§€κ²Œ ν•œλ‹€.

Nλͺ…μ˜ μ„ μˆ˜λ“€μ— λŒ€ν•΄, 길이가 N인 μˆœμ—΄ 000···111 λΆ€ν„° μ‹œμž‘ν•΄μ„œ λ‹€μŒ μˆœμ—΄μ„ ꡬ해가며 λŠ₯λ ₯치λ₯Ό κ³„μ‚°ν•œλ‹€.

 

πŸŒΏμ½”λ“œ:

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int N;
	cin >> N;
	vector<vector<int>> a(N, vector<int>(N)); // 2차원 벑터 μ΄ˆκΈ°ν™”
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> a[i][j];
		}
	}
	vector<int> players(N, 0); // 각 μ„ μˆ˜μ˜ νŒ€μ„ ν‘œμ‹œν•˜λŠ” 벑터
	for (int i = 0; i < N / 2; i++) {
		players[i] = 1;
	}
	sort(players.begin(), players.end());
	int ans = INT_MAX;
	do {
		vector<int> team1;
		vector<int> team2;
		for (int i = 0; i < N; i++) {
			if (players[i] == 0) {
				team1.push_back(i);
			}
			else {
				team2.push_back(i);
			}
		}
		// λŠ₯λ ₯치 계산
		int tmp1 = 0;
		int tmp2 = 0;
		for (int i = 0; i < N / 2; i++) {
			for (int j = 0; j < N / 2; j++) {
				if (j == i) continue;
				tmp1 += a[team1[i]][team1[j]];
				tmp2 += a[team2[i]][team2[j]];
			}
		}
		int diff = (tmp1 > tmp2) ? tmp1 - tmp2 : tmp2 - tmp1;
		if (diff < ans) {
			ans = diff;
		}

	} while (next_permutation(players.begin(), players.end()));

	cout << ans << '\n';
	return 0;
}