※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 15553번 문제인 난로이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/15553 

 

먼저, 첫 친구가 오는 시점에 맞춰 난로를 키고 마지막 친구가 가는 시점에 맞춰 난로를 꺼야 함은 자명하다. 이 두 행동을 제외하고 생각하면 난로는 총 K1번 끄고 킬 수 있다. 언제 이와 같은 조작을 하는 것이 난로가 켜진 시간을 최소화하는 전략일까?

 

문제를 (난로를 처음 키고 마지막으로 끈 시간 사이의) 난로가 꺼져있는 시간을 최대화하는 문제로 바꿔 생각해보자. 난로를 한번 끄고 킬 때 추가적으로 얻을 수 있는 "난로가 꺼져있는 시간"은 (인접한 시간에 오는 두 친구의 Ti값의 차 - 1)이 된다. 따라서 두 친구가 오는 시간간격들 중 그 차 가운데 가장 큰 K1개를 골라 전체 구간(처음 난로를 켜야하는 때부터 마지막에 난로를 꺼야하는 때까지)에서 빼는 것으로 구할 수 있다. 이를 이용하면 난로가 켜져있는 시간을 최소화하는 문제 또한 같이 해결할 수 있게 된다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
using namespace std;

int N, K;
priority_queue<int> pq;
int A[100000];
int ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> K; K--;
	for (int i = 0; i < N; i++) cin >> A[i];
	ans = A[N - 1] - A[0] + 1;
	for (int i = 1; i < N; i++) pq.push(A[i] - A[i - 1] - 1);
	
	while (K--) {
		ans -= pq.top();
		pq.pop();
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 19949 // C++] 영재의 시험  (0) 2024.05.09
[BOJ 11391 // C++] 분배  (0) 2024.05.08
[BOJ 25917 // C++] Prime Arrangement  (0) 2024.05.06
[BOJ 18231 // C++] 파괴된 도시  (0) 2024.05.05
[BOJ 12742 // C++] 혼합물 (Small)  (0) 2024.05.04

+ Recent posts