14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
조합을 쓰자.
- 후보 candidate를 N명 생성한다.
- 조합을 통해 스타트팀을 구하고 나머지를 링크팀으로 정한다.
- 스타트팀 점수는 더하고 링크팀 점수는 뺀다
- 절대값이 가장 작은 값을 출력한다.
import sys
from itertools import combinations
input = sys.stdin.readline
N = int(input())
arr = []
for _ in range(N):
_input = list(map(int, input().split()))
arr.append(_input)
candidate = [i for i in range(N)]
result = sys.maxsize
for comb in combinations(candidate, N//2):
start = set(comb)
link = set(candidate) - start
start = list(start)
link = list(link)
score = 0
for i in range(1, N//2):
for j in range(i):
score += arr[start[i]][start[j]] + arr[start[j]][start[i]]
score -= arr[link[i]][link[j]] + arr[link[j]][link[i]]
result = min(abs(score), result)
print(result)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 1655] 가운데를 말해요 (python) (0) | 2021.04.27 |
---|---|
[백준 21608] 상어 초등학교 (python) (0) | 2021.04.26 |
[백준 2096] 내려가기 (python) (0) | 2021.04.26 |
[백준 2143] 두 배열의 합 (python) (0) | 2021.04.26 |
[백준 1806] 부분합 (python) (0) | 2021.04.23 |
최근댓글