Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Dag
- BOJ
- BST
- Euler path
- CS Academy
- GCD
- flows
- disjoint-set
- Algospot
- bitmask
- Sieve_of_Eratosthenes
- hashing
- Shortest path
- Cycle detecting
- graph
- scc
- Segment Tree
- implementation
- dynamic programming
- DynamicProgramming
- 백준
- Greedy
- BFSDFS
- POJ
- mathematics
- graph modeling
- Eulerian path
- backtracking
- Eulerian circuit
- Euler circuit
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 4384 공평하게 팀 나누기 본문
* BOJ 4384 공평하게 팀 나누기
[분류 : 다이나믹 프로그래밍]
[풀이]
N/2명을 배치하면 나머지 N/2+N%2명은 자동으로 배정된다. 따라서 N/2명이 가능한 점수를 모두 구한 뒤 이를 전체 총합에서 뺀 값과의 차이를 최소화하면 되시겠다.
동전 교환 문제처럼 생각해보자.
i번째 사람을 추가하면서 1~N/2명팀을 구성할 때의 값을 구한다. N/2명의 점수 총합의 최대값은 최대 인원수 / 2 * 인원당 최대 점수로 계산 가능하다.
계산해보면 알겠지만, 수 자체가 배열에 담기에 충분히 작기 때문에, i번째 사람을 추가할 때 i-1번째 사람까지 1~N/2명을 팀을 이루도록 했을 때의 "가능한 모든 점수"에서 추가하는 방식으로 진행하면 된다.
이렇게 N번째 사람까지 N/2명으로 구성했을 때의 가능한 점수를 가지고 반대편 팀을 구한 뒤 여기서의 최소값을 구해주면 된다.
※ 주의해야할 점은 인원수를 오름차순으로 방문하면 데이터가 오염될 수 있기 때문에 인원수를 내림차순으로 방문해야 한다.
'Solved problems' 카테고리의 다른 글
BOJ 2543 초고속철도 (0) | 2020.05.28 |
---|---|
BOJ 2888 상범 게임 (0) | 2020.05.28 |
BOJ 1410 패턴의 개수 (0) | 2020.05.25 |
BOJ 1742 레이싱 결과 (0) | 2020.05.25 |
BOJ 1040 정수 (0) | 2020.05.24 |
Comments