PS

BOJ 1826 - 연료 채우기

728x90

www.acmicpc.net/problem/1826

 

1826번: 연료 채우기

첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있는데 a(1 ≤ a ≤ 1,000,000)는 성경

www.acmicpc.net

 

이 문제는 그리디 방식으로 풀어야 하는문제다

왜냐면, 가지고 있는 연료의 양이 제한적이고, 주유소를 최소한으로 방문해야 하기 때문이다.

 

정렬의 기준은 현 위치에서 주유소 까지의 거리가 가까운 순서대로 정렬한다

그리고 목적지 까지의 거리(L) 와 현재 보유하고 있는 연료량(P) 을 비교했을때, P 가 더 적은 경우 주유소를 방문해서 충전을 해야만한다.

그리고 우선순위 큐(최대힙) 을 만들어서, 방문 하는 주유소에서의 주유량을 최대힙 정렬한다.

(우선순위 큐를 쓰는 이유는 N 의 최대가 만 이기 때문에, 단순히 이중 포문으로 하나하나 비교하면 시간 초과 되므로)

 

최대 주유량만 빼내오면서 거리를 갱신하면 굳이 방문하지 않아도될 주유소를 건너뛸 수가 있다.

 

 

- c++

#include <bits/stdc++.h>
 
using namespace std;
 
int N, answer;
int L, P; // 마을까지 거리, 기존 연료량 
vector<pair<intint>> gas_station; // 주유소 까지 거리, 채울 수 있는 연료량 
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> N;
    
    for (int i = 0; i < N; ++i) {
        int a, b;
        cin >> a >> b;
        gas_station.push_back({a, b});
    }
    
    cin >> L >> P;
    
    sort(gas_station.begin(), gas_station.end()); // 주유소 까지 거리 기준 오름차순
    
    priority_queue<int> pq;
    
    // 현재 인덱스, 가지고 있는 연료량
    int idx = 0, cur_gas = P;
    
    while(cur_gas < L) { // 목적지 거리보다 연료량이 적으면 주유소 가야됨 
        while(idx < N && gas_station[idx].first <= cur_gas) {
            pq.push(gas_station[idx].second);
            idx++;
        }
        
        if (pq.empty()) { // 더 이상 갈 수 없을때 
            answer = -1;
            break;
        }
        
        cur_gas += pq.top();
        pq.pop();
        answer++;
    } 
    
    cout << answer;
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 3197 - 백조의 호수  (0) 2021.02.21
BOJ 1450 - 냅색문제  (0) 2021.02.20
BOJ 1202 - 보석 도둑  (0) 2021.02.20
BOJ 5557 - 1학년  (0) 2021.02.14
BOJ 2228 - 구간 나누기  (0) 2021.02.14