어흥

[백준 1826] 연료 채우기 (C++) 본문

알고리즘/백준

[백준 1826] 연료 채우기 (C++)

라이언납시오 2020. 4. 4. 18:41
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1826

 

1826번: 연료 채우기

첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있는데 a(1 ≤ a ≤ 1,000,000)는 성경이의 시작 위치에서 주유소 까지의 거리, 그리고 b(1 ≤ b ≤ 100)는 그 주유소에서 채울 수 있는 연료의 양을 의미한다. 그리고 N+2번째 줄에는 두 정수 L과 P가 주어지는데 L(1 ≤ L ≤ 1,000,000)은 성경이

www.acmicpc.net

1. 주의할 점

- 입력 받는 주유소의 정보가 거리순이 아니다

 

2. 구현

- 주유소의 정보를 우선순위 큐 PQ2에 입력받는다(거리순으로 오름차순 정렬)

- While문 시작

- 현재 보유한 연료로 목적지에 도달 할 수 있다면 While문을 끝낸다

- 현재 보유한 연료로 갈 수 있는 모든 주유소를 우선순위 큐 PQ에 넣는다(충전할 수 있는 연료순으로 내림차순 정렬)

- PQ가 비어있다면 Result = -1로 바꾸고 While문을 끝낸다

- PQ에서 1개 씩 Pop하면서 위의 과정을 반복한다

- While문 끝

 

#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
int num;
bool check[10000] = { false, };
struct info {
	int dist, oil;
};
struct cmp {
	bool operator()(info &a, info &b) {
		return a.oil < b.oil;
	}
};
struct cmp2 {
	bool operator()(info &a, info &b) {
		return a.dist > b.dist;
	}
};
info tmp;
priority_queue<info, vector<info>, cmp> pq;
priority_queue<info, vector<info>, cmp2> pq2;

int main() {
	int dist, val, destination, fuel, result = 0;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> dist >> val;
		tmp.dist = dist;
		tmp.oil = val;
		pq2.push(tmp);
	}
	cin >> destination >> fuel;

	while (fuel < destination) {
		//보유한 연료로 갈 수 있는 주유소 다 넣는다
		while (!pq2.empty() && fuel >= pq2.top().dist) {
			tmp.dist = pq2.top().dist;
			tmp.oil = pq2.top().oil;
			pq.push(tmp);
			pq2.pop();
		}
		if (pq.empty()) {
			result = -1;
			break;
		}
		int supp = pq.top().oil;
		pq.pop();
		fuel += supp;
		result++;
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2225] 합분해 (C++)  (0) 2020.04.06
[백준 14225] 부분수열의 합 (C++)  (0) 2020.04.05
[백준 1715] 카드 정렬하기 (C++)  (0) 2020.04.04
[백준 2636] 치즈 (C++)  (0) 2020.04.04
[백준 8972] 미친 아두이노 (C++)  (0) 2020.04.03
Comments