문제 링크
- http://icpc.me/9007
문제 출처
- 2012 ACM-ICPC 대전 인터넷 예선 B번
사용 알고리즘
- Parametric Search
시간복잡도
- O(n2 log n2)
풀이
이 문제는 n이 최대 1000이기 때문에 O(n4)이나 O(n3)으로는 풀리지 않습니다. 탐색 횟수를 줄이는 것이 이 문제 해결의 요점입니다.
4개의 반에서 한 명씩 뽑아 4명의 몸무게의 합이 k에 가장 가까우면 정답이 되는 문제입니다. 4중 for문을 이용하면 O(n4)으로 답을 구할 수 있겠지만 위헤서 언급했듯이 시간초과가 납니다. 다른 방법을 찾아봅시다.
O(n2)만에 2개의 반에서 가능한 모든 합을 구할 수 있습니다. 이를 이용해 1 / 2반에서 가능한 모든 합, 그리고 3 / 4반에서 가능한 모든 합을 구한 뒤, 각각 정렬해줍니다.
이렇게 전처리를 해준 뒤, 1 / 2반의 합을 저장한 배열의 원소를 순회해줍시다. 1 / 2반 배열을 순회하면서 3 / 4반의 합을 저장한 배열에서는 이진 탐색을 이용해 가장 k와 가까운 값을 찾아서 출력을 해주면 됩니다.
전체 코드
1 |
|