14889๋ฒ: ์คํํธ์ ๋งํฌ
์์ 2์ ๊ฒฝ์ฐ์ (1, 3, 6), (2, 4, 5)๋ก ํ์ ๋๋๋ฉด ๋๊ณ , ์์ 3์ ๊ฒฝ์ฐ์๋ (1, 2, 4, 5), (3, 6, 7, 8)๋ก ํ์ ๋๋๋ฉด ๋๋ค.
www.acmicpc.net
โจ ๋ด ์์ค ์ฝ๋
#include<iostream>
#include <vector>
#include<algorithm>
const int MAX = 2147483647;
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
int stats[20][20];
int N,result=MAX;
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> stats[i][j];
}
}
//๋นํธ ๋ง์คํน ๋ฐฉ์์ผ๋ก ํ
//N=4 ์ผ๋, 0010 ๋ถํฐ 1111๊น์ง์ ์ซ์๋ฅผ ํ์
//N=6 ์ผ๋, 000100๋ถํฐ 111111๊น์ง์ ์ซ์
for (int i = (1 << ((N / 2) - 1)); i < (1 << N); i++) {
//1์ ๊ฐ์๋ฅผ ์นด์ดํธ
int bit_count=0;
//j์ ๋นํธ๊ฐ 0๋ถํฐ 1,10,100,1000๊ณผ ๊ฐ์ด ๋์ด๋๋ค
//์ด ๊ฐ์ i์ AND์ฐ์ฐ์ ํ์ฌ 1์ธ์ง ํ๋ณ
//ex) 0010๊ณผ 01์ ANDํ๋ฉด 0
//ex) 0010๊ณผ 10์ ANDํ๋ฉด 10 -> 1๊ฐ์ ์ฆ๊ฐ
for (int j = 0; j < N;j++) {
if (i&(1 << j)) {
bit_count += 1;
}
}
//1์ ๊ฐ์๊ฐ N์ ์ ๋ฐ์ธ์ง ํ์ธ
if (bit_count != N / 2)continue;
//1๊ณผ 0์ ๊ฐ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, 1์ start๋ฒกํฐ์ 0์ link๋ฒกํฐ์ ๋ฃ๋๋ค
vector<int> start, link;
for (int j = 0; j < N;j++) {
if (i&(1 << j)) {
start.push_back(j);
}
else {
link.push_back(j);
}
}
//๋ฒกํฐ์ ์๋ ๊ฐ์ผ๋ก ๊ฐ ํ์ ๋ฅ๋ ฅ์น ํฉ์ฐ
int start_stats = 0, link_stats = 0;
for (int j = 0; j < N/2; j++) {
for (int k = 0; k < N/2; k++) {
start_stats += stats[start[j]][start[k]];
link_stats+=stats[link[j]][link[k]];
}
}
//์ต์๊ฐ ๊ตฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ
int min_value = start_stats - link_stats;
if (min_value < 0) min_value *= -1;
result = min(result, min_value);
}
cout << result;
return 0;
}
๐ ๋ฌธ์ ํ์ด
๋ฐฑ์ค์ ๋ถ๋ฅ๋ฅผ ๋ณด๋ ๋ฐฑํธ๋ํ ๊ณผ ๋นํธ๋ง์คํน ๋ฐฉ์์ผ๋ก ํ ์ ์๋ ๊ฒ ๊ฐ์๋ฐ, ๋ฐฑํธ๋ํน๋ณด๋ค๋ ๋นํธ๋ง์คํน๊ฐ ํจ์จ์ด ์ข์ ๊ฒ ๊ฐ์ ๋นํธ ๋ง์คํน ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ค
๐ฑ ๋นํธ๋ก ํ์
for (int i = (1 << ((N / 2) - 1)); i < (1 << N); i++) {
}
N=4์ผ๋, i๋ 0010 ~ 1111๊น์ง์ ์ซ์ ์ฆ, 2 ~ 15๋ฅผ ํ์ํ๊ฒ ๋๋ค
N=6์ผ๋, i๋ 000100 ~ 111111๊น์ง์ ์ซ์ ์ฆ, 4 ~ 63์ ํ์ํ๊ฒ ๋๋ค
๊ทธ๋ฌ๋ฉด 0์ ๊ฐ์์ 1์ ๊ฐ์๊ฐ ์๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ด๊ฒ ๋๋๋ฐ
์ฐ๋ฆฌ๋ 0๊ณผ 1์ ๊ฐ์๊ฐ ์ ํํ ๊ฐ์ ๊ฒฝ์ฐ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์๋ค
for (int j = 0; j < N;j++) {
if (i&(1 << j)) {
bit_count += 1;
}
}
j๋ 0, 01, 10, 100, 1000๊ณผ ๊ฐ์ ๋นํธ๊ฐ์ผ๋ก ์ฆ๊ฐํ๊ฒ ๋๋ค
N=4์ผ๋, j๋ 0, 01, 10, 100, 1000์ ๊ฐ์ ์ฐจ๋ก๋๋ก ๊ฐ์ง๊ฒ ๋๊ณ ์ด ๊ฐ์ i์ ๋นํธ AND ์ฐ์ฐ์ ํ๊ฒ ๋๋ค
๋ง์ฝ i = 2 = 0010 ์ด๊ณ j=0000์ผ ๊ฒฝ์ฐ, i & j๋ 0000์ด ๋๋ค
j = 0001์ผ ๊ฒฝ์ฐ, i&j๋ 0000์ด ๋๋ค
j = 0010์ผ ๊ฒฝ์ฐ, i&j๋ 0010์ด ๋๋ค ๋ฐ๋ผ์ 1์ ๊ฐ์ ์นด์ดํธ + 1์ ํด์ค๋ค
j = 0100์ผ ๊ฒฝ์ฐ, i&j๋ 0000์ด ๋๋ค
j = 1000์ผ ๊ฒฝ์ฐ, i&j๋ 0000์ด ๋๋ค
๋ฐ๋ผ์ ์์ ๊ฒฝ์ฐ์๋ 1๊ณผ 0์ ๊ฐ์๊ฐ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์, ๋ค์ i์ ๊ฐ(0011)์ ํ์ํด๋ณด๊ฒ ๋๋ค
if (bit_count != N / 2) continue;
๐ฑ 0๊ณผ 1๋ก ํ์ ๋๋ ๋ฅ๋ ฅ์น ๊ณ์ฐํ๊ธฐ
vector<int> start, link;
for (int j = 0; j < N;j++) {
if (i&(1 << j)) {
start.push_back(j);
}
else {
link.push_back(j);
}
}
1์ ๊ฐ์์ 0์ ๊ฐ์๊ฐ ๋์ผํ i ๊ฐ์ ์ฐพ์๋ด๋ฉด, startํ๊ณผ linkํ์ ๋ถ๋ฅ์์ผ์ฃผ์ด์ผํ๋ค
์์์ ์ฌ์ฉํ ๋ฐฉ์์ ํ์ฉํ์ฌ, 1์ด๋ฉด start ๋ฒกํฐ์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ
0์ด๋ฉด link ๋ฒกํฐ์ ๊ฐ์ ๋ฃ์ด์ฃผ์ด์ ํ์ ๋๋๊ฒ ๋๋ค
์๋ฅผ ๋ค์ด, i = 0011์ด๋ผ๋ฉด
j = 0000 (10์ง์ 0), 0001 (10์ง์ 1), 0010 (10์ง์ 2), 0100 (10์ง์ 3), 1000 (10์ง์ 4)์ ๊ฐ์ ์ฐจ๋ก๋ก ๊ฐ์ง๋ฉฐ ๋ฐ๋ณต๋ฌธ์ด ๋์๊ฐ๊ฒ ๋๋๋ฐ
0011 & 0001 = 0001 ์ด๋ฏ๋ก, 1์ start๋ก ๋ถ๋ฅ๋๋ค
0011 & 0010 = 0010 ์ด๋ฏ๋ก, 2๋ start๋ก ๋ถ๋ฅ๋๋ค
0011 & 0100 = 0000 ์ด๋ฏ๋ก, 3์ link๋ก ๋ถ๋ฅ๋๋ค
0011 & 1000 = 0000 ์ด๋ฏ๋ก, 4๋ link๋ก ๋ถ๋ฅ๋๋ค
int start_stats = 0, link_stats = 0;
for (int j = 0; j < N/2; j++) {
for (int k = 0; k < N/2; k++) {
start_stats += stats[start[j]][start[k]];
link_stats+=stats[link[j]][link[k]];
}
}
int min_value = start_stats - link_stats;
if (min_value < 0) min_value *= -1;
result = min(result, min_value);
๋ถ๋ฅ ํ ๊ฒ์ ๋ฐํ์ผ๋ก startํ๊ณผ linkํ์ ๋ฅ๋ ฅ์น๋ฅผ ๊ณ์ฐํ๊ณ ์ด ๋ ํ์ ์ต์๊ฐ์ ๊ตฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ฉด ๋๋ค
๐ฑ ๋ฌธ์ ํ์ด ๊ฒฐ๊ณผ
