Problem Solving/BOJ

[백준 9576번] [그리디] 책 나눠주기

  • -
728x90
반응형

사실 이 문제는 백준 19580번 "마스크가 필요해"와 완전히 접근방법이 동일하다.

viyoung.tistory.com/171

 

[백준 19580번] [그리디/ 우선순위 큐] 마스크가 필요해

문제를 보고 생각보다는 쉽게 그리디 문제임을 파악할 수 있다. 문제 조건을 잘 보면, 최대한 많은 시민이 마스크를 구매할 수 있도록 유도해야한다. 즉 상식적으로 이 워딩을 보면 모든 시민들

viyoung.tistory.com

왜냐하면, 9676번과 19580문제에서 가장 Tight하게 해당 value를 만족하는 것을 선택한다는 핵샘이 동일하기 때문이다.

 

이전 19580문제 해설에서 언급한 것처럼

책을 가질 수 있는 scope를 increasing order로 정렬하고, 책 또한 번호를 증가시켜가면서 책을 가질 수 있는 후보가 될 수 있는지를 체크해주면 된다. 책을 가질 수 있는 후보 중 가장 tight하게 만족하는 것을 골라주면 된다.

추가적으로 pq에 넣은 것들은 책 번호가 계속 증가하고 있는 상황이므로 각 개인의 책 scope의 하한선을 책 번호가 무조건 넘게 된다. 따라서 상한선 밑에 책 번호가 존재하는지만 판단해주면 된다.

 

따라서 이 문제 또한 O(nlgn)에 처리할 수 있게 된다.

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;
typedef pair<int, int> pii;

struct compare{
    bool operator()(const pii &value1, const pii &value2){
        return value1.second> value2.second;
    }
};

int main(void){
    fastio;
    int t;
    cin >> t;

    for(int i = 0; i < t; i++){
        priority_queue<pii, vector<pii>, greater<pii> > pq;
        int n, m;
        cin >> n >> m;
        for(int j = 0; j < m; j++){
            int temp1, temp2;
            cin >> temp1 >> temp2;
            pq.push(make_pair(temp1, temp2));
        }
        priority_queue<pii, vector<pii>, compare> check_pq;
        int result = 0;
        for(int j = 1; j <= n; j++){
            while(!pq.empty()){
                pii check = pq.top(); pq.pop();
                if(check.first <= j && j <= check.second){
                    check_pq.push(check);
                }
                else{
                    pq.push(check);
                    break;
                }
            }
            while(!check_pq.empty()){
                pii booked = check_pq.top(); check_pq.pop();
                if(j <= booked.second){
                    result += 1;
                    break;
                }
            }
        }
        cout << result << "\n";
    }

    return 0;
}

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.