ps:problems:boj:15553
난로
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 15553 |
문제명 | 난로 |
레벨 | 골드 5 |
분류 |
그리디 |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=5000 |
사용한 언어 | Python 3.13 |
제출기록 | 40904KB / 96ms |
최고기록 | 88ms |
해결날짜 | 2025/03/01 |
풀이
- 꺼져있는 시간을 최대로 하면, 켜져있는 시간은 최소가 된다. 켜져있는 K개의 구간을 찾는것보다 꺼져있는 K-1개의 구간을 찾는 것이 더 쉽다.
- 꺼져있는 구간은, 첫번째 친구가 온 시점부터 마지막 친구가 가는 시점 사이에 총 K-1번이 있을 수 있다. 꺼져있는 구간이 될 수 있는 후보들은, i번째 친구가 나가는 시점부터 i+1번 친구가 들어오는 시점이므로, 총 N-1개의 구간이다. 이 N-1개의 구간중 가장 긴 구간 K-1개를 찾아서 그 시간동안 촛불을 꺼두면 된다.
- 시간복잡도는 O(n)개의 원소중에서 최솟값 O(k)개를 찾는데 걸리는 시간이므로 우선순위큐를 써서 O(n+klogn)에 찾을수 있다. 하지만, k가 최대 n이므로, 결국 O(nlogn)이고, 그러면 다 정렬해놓고 k개를 찾는 방법이 더 빠르게 동작한다.
코드
"""Solution code for "BOJ 15553. 난로".
- Problem link: https://www.acmicpc.net/problem/15553
- Solution link: http://www.teferi.net/ps/problems/boj/15553
Tags: [greedy]
"""
import itertools
import sys
def main():
N, K = [int(x) for x in sys.stdin.readline().split()]
T = [int(sys.stdin.readline()) for _ in range(N)]
no_visitor_times = sorted(
(y - x - 1 for x, y in itertools.pairwise(T)), reverse=True
)
answer = T[-1] - T[0] + 1 - sum(no_visitor_times[: K - 1])
print(answer)
if __name__ == '__main__':
main()
ps/problems/boj/15553.txt · 마지막으로 수정됨: 2025/03/01 14:46 저자 teferi
토론