알고리즘

[백준 1911] 흙길 보수하기

JB_ROBOT_VISION 2020. 10. 14. 01:40

www.acmicpc.net/problem/1911

 

1911번: 흙길 보수하기

어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 흙으로 된 비밀길 위에 폭우가 내려서 N (1 <= N <= 10,000) 개의 물웅덩이가 생겼다. 월드학원은 물웅덩이를 덮을 수 있는 길이 L (L은 양의 정수)

www.acmicpc.net

 

이 문제는 priority Queue를 통해 순차적으로 길을 Sorting 한 뒤

하나씩 Pop 하면서 푸는 문제이다.

 

하나의 조건만 생각하면 쉽게 풀리는 문제인데

이전에 다리를 설치해서 보수된 끝영역을 저장하고 

다음으로 흙길이 시작하는 부분과 비교하여 보수된 영역을

고려해주는 방식으로 풀면 된다.

 

#include <iostream>
#include <queue>

using namespace std;

int main(void)
{
	int N = 0;
	int L = 0;
	int M_st = 0;
	int M_fi = 0;
    priority_queue< pair<int, int> > prior_Que;

	int Pos = 0;
	int cnt = 0;

	cin >> N >> L;

	for(int i = 0; i < N; i++)
	{
		cin >> M_st;
		cin >> M_fi;
        pair<int, int> pTmp = make_pair(-M_st, -M_fi);    
        prior_Que.push(pTmp);
	}

    while(!prior_Que.empty())
    {
        pair<int, int> pTmp = prior_Que.top();
        prior_Que.pop();
        
        if(-pTmp.first > Pos) 
            Pos =  -pTmp.first;

        while(-pTmp.second > Pos)
        {
            Pos += L;
            cnt++;
        }
    }

	cout << cnt << endl;

	return 0;
}