ps:problems:boj:13164
행복 유치원
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 13164 |
문제명 | 행복 유치원 |
레벨 | 골드 5 |
분류 |
그리디 |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=300,000 |
사용한 언어 | Python |
제출기록 | 65852KB / 268ms |
최고기록 | 268ms |
해결날짜 | 2022/01/26 |
풀이
- K개의 조를 a[0]~a[i1] / a[i1+1]~a[i2] / a[i2+1]~a[i3] / … / a[i(k-1)+1] ~ a[n-1] 으로 나눠서 만들었다고 하면. 티셔츠의 비용은 a[i1]-a[0] + a[i2]-a[i1+1] + … + a[n-1] - a[i(k-1)+1] 이다. 식 순서를 바꾸면 (a[n-1]-a[0]) - (a[i1+1] - a[i1]) - (a[i2+1] - a[i2]) - … - (a[i(k-1)+1] - a[i(k-1)]) 이 된다. 즉 고정된 값에서, 인접한 숫자 페어를 (k-1)개 골라서 그 차를 전부 빼준것이고, 이 값이 최소가 되게 하려면 빼주는 값을 최대로 하면 된다. 결국 인접한 숫자 페어중 차이가 가장 큰 것을 k-1개 찾아서 빼면 된다.
- 식을 조금 바꿔서 a[n-1]-a[0] = (a[1]-a[0]) + (a[2]-a[1]) + … + (a[n-1]-a[n-2])로 바꿔서 쓰면, 인접한 숫자 페어의 차 중에서 가장 작은값 n-k개를 더해주는 것으로 바꿀수도 있다.
- 인접한 숫자간의 차이들을 O(n)에 구하고, O(nlogn)에 정렬한 뒤에 (n-k)개의 합을 구하면 되므로 총 시간복잡도는 O(nlogn).
- 센서도, 문제 설명은 좀 다르지만, 결국 동일한 것을 구하는 문제이다
코드
"""Solution code for "BOJ 13164. 행복 유치원".
- Problem link: https://www.acmicpc.net/problem/13164
- Solution link: http://www.teferi.net/ps/problems/boj/13164
Tags: [Greedy]
"""
import itertools
def main():
N, K = [int(x) for x in input().split()] # pylint: disable=unused-variable
heights = [int(x) for x in input().split()]
diffs = [b - a for a, b in itertools.pairwise(heights)]
print(sum(sorted(diffs)[:N - K]))
if __name__ == '__main__':
main()
ps/problems/boj/13164.txt · 마지막으로 수정됨: 2022/01/28 16:07 저자 teferi
토론