본문 바로가기
온라인저지

[BOJ] 15553번: 난로

by plzfday 2018. 9. 30.

문제 링크

2018년 JOI 1번 문제다. 난로가 켜져 있는 시간은 N + α 인 것은 자명하다.

그렇다면 α를 알아야 한다. 성냥이 N보다 부족하면 계속 켜놔야 하는 시간을 알아야 하는데 예제를 보면서 계산하는 것이 좀 더 좋을 것 같다.

[예시1] 1 3 6

K가 2일 땐 1 3 사이[1초]나 3 6 사이[2초]를 계속 틀어놔야 할 것이다.

이것에 착안해서 나는 우선순위 큐(오름차순 정렬)를 사용해서

(친구들 방문이 이어져 있지 않을 경우) 일 때 간격을 우선순위 큐에 저장을 시키고, 만약 이어져 있는 경우에는 cnt를 증가시켰다.

그래서 우선순위 큐에서 pop을 시키는 횟수는

가 된다.

난로가 켜져 있는 시간의 최솟값을 구해야 하므로 정답은

이 된다.

#include <bits/stdc++.h>
using namespace std;

int n, k, cnt, arr[100001];
priority_queue<int, vector<int>, greater<int>> pq;

int main()
{
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &arr[i]);
    }

    for (int i = 1; i < n; ++i) {
        if (arr[i] - arr[i - 1] - 1 != 0)
            pq.push(arr[i] - arr[i - 1] - 1);
        else
            cnt++;
    }

    int tmp = n - cnt - k;
    while (tmp-- > 0) {
        n += pq.top();
        pq.pop();
    }
    printf("%d\n", n);
    return 0;
}
 
 

'온라인저지' 카테고리의 다른 글

BOJ 12865: 평범한 배낭  (0) 2022.05.21
BOJ 2981: 검문  (0) 2022.05.19
BOJ 2493번: 탑  (0) 2021.06.22
[BOJ] 2842번: 집배원 한상덕  (2) 2018.09.13
[BOJ] 1309번: 동물원  (0) 2018.08.31
[BOJ] 1699번: 제곱수의 합  (0) 2018.08.30

댓글