어흥
[백준 1826] 연료 채우기 (C++) 본문
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