BOJ 1658 돼지 잡기
BOJ 1658 돼지 잡기
문제 내용
개의 돼지우리에 의 번호가 매겨져 있으며, 번 돼지우리에는 현재 마리의 돼지가 있습니다.
명의 손님이 순서대로 와서 다음과 같은 방식으로 돼지를 사 가려고 합니다.
- 번째 손님은 번 돼지우리를 열고, 열린 돼지우리에서 최대 마리의 돼지를 사 갑니다.
- 그 뒤에는 열린 돼지우리에 남아있는 돼지들을 원하는 대로 재분배한 뒤 돼지우리들을 모두 닫습니다.
이때 팔 수 있는 돼지의 수의 최댓값을 구하세요.
입력
첫 줄에는 돼지우리의 수 과 손님의 수 이 주어집니다. (, )
두 번째 줄에는 각 돼지우리에 있는 돼지의 수 가 순서대로 주어집니다. ()
다음 줄에는 각각 번째 손님의 행동을 나타내는 값 가 주어집니다. (, )
문제 풀이
스포일러
이 문제는 다음과 같이 플로우 문제로 모델링할 수 있습니다. 1 단위의 흐름은 돼지 1마리의 이동으로 볼 수 있습니다.
- 각각의 돼지우리에 대해 노드를 만들고, 소스와 각각의 돼지우리를 용량 의 간선으로 연결합니다.
- 각 손님에 대해 노드를 만들고, 이들 노드와 싱크를 용량 의 간선으로 연결합니다.
- 각 손님이 여는 돼지우리의 번호에 대해서, 그 돼지우리를 마지막으로 열었던 손님의 노드로부터 현재 노드로 가는 용량 의 간선을 만듭니다. 그러한 손님이 없었다면 돼지우리 노드에서 직접 연결합니다.
그러면 각각의 돼지의 모든 흐름을 이 플로우 그래프 내에서 표현할 수 있습니다. 이제 최대 용량 알고리즘을 적용하여 답을 구하면 됩니다.
Last updated on