문제 링크
- http://icpc.me/15824
사용 알고리즘
- 정렬
풀이
가능한 모든 조합에 대해, (최댓값 - 최솟값)의 합을 구하는 문제입니다. N이 최대 30만까지 주어지기 때문에, 완전탐색으로 풀 수는 없습니다.
각각의 스코빌 지수(이하 x)에 대해, x가 최대가 되는 조합의 수와 x가 최소가 되는 조합의 수만 빠르게 알 수 있다면 정답을 쉽게 구할 수 있습니다.
먼저 정렬을 해줍시다. 정렬을 하게 되면 x보다 작은 수들은 모두 앞쪽, 큰 수들은 모두 뒤쪽으로 이동합니다.
x보다 작은 수가 i개 있다면, x가 최대가 되는 조합의 수는 2i인 것은 쉽게 알 수 있습니다.
x보다 큰 수가 j개 있다면, x가 최소가 되는 조합의 수는 2j입니다.
모든 x에 대해 x보다 작은 수가 i개, x보다 큰 수가 j개 있다면 (2i - 2j) * x의 합을 구해주면 됩니다.
거듭제곱은 O(log N)시간에 계산할 수 있기 때문에, O(N log N)만에 정답을 구할 수 있습니다.
전체 코드
1 |
|