Baekjoon/Gold

C++ / 백준 / 1826 / 연료 채우기

GitHubSeob 2023. 6. 14. 17:51

문제

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

 

1826번: 연료 채우기

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

www.acmicpc.net

 

문제풀이

트럭이 주유소에 도착할 때마다 멈춰야 하는지를 판별하는 것이 아닌, 되돌리기를 한다고 생각하면 된다.

현재 위치에서 갈 수 있는 최대 위치를 구하고, 그 사이의 주유소 중에서 가장 많은 연료를 얻을 수 있는 주유소에 간다.

우선순위 큐를 이용해 갈 수 있는 주유소를 연료의 양 기준으로 내림차순으로 하여 가장 많은 연료를 채운다.

 

먼저 입력받은 주유소 정보를 벡터에 저장하고, 오름차순으로 정렬을 한다.

loc변수는 최종 목적지인 마을 위치를, gas변수는 현재 가스의 양을 저장한다.

gas는 최대로 갈 수 있는 위치를 나타내기도 한다.

 

목적지에 도달 못했을 때, 우선순위 큐가 비어있다면 가진 기름으로 주유소를 갈 수 없으므로 while문을 종료한다.

우선순위 큐가 비어있지 않다면 주유소를 갈 수 있으므로 멈춘 횟수를 1 더하고, gas에 주유소 기름을 더하고, pop을 하여 다녀간 주유소 정보를 삭제한다. 목적지에 도착하거나 (gas >= loc), 더 갈 주유소가 없다면(pq.empty()) -1을 출력한다.

 

코드

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

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

	long long N(0), idx(0), gas(0), loc(0), answer(0);

	cin >> N;

	vector<pair<long long, long long>>gs(N, { 0,0 });
	priority_queue<long long>pq;

	for (idx = 0; idx < N; ++idx) {
		cin >> gs[idx].first >> gs[idx].second;
	}

	sort(gs.begin(), gs.end());

	cin >> loc >> gas;

	idx = 0;

	while (gas < loc) {
		for (idx; idx < N; ++idx) {
			if (gas >= gs[idx].first) {
				pq.push(gs[idx].second);
			}
			else break;
		}
		if (pq.empty()) {
			break;
		}
		else if (!pq.empty()) {
			answer++;
			gas += pq.top();
			pq.pop();
		}

	}
	if (gas >= loc) {
		cout << answer;
		return 0;
	}
	else cout << "-1";
}