https://www.acmicpc.net/board/view/79605
글 읽기 - 테케 몇개 남깁니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
https://nato-blog.tistory.com/102
[백준] 1826 - 연료 채우기
[문제링크] 1826번: 연료 채우기 첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있
nato-blog.tistory.com
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
class Heap {
int[] arr;
int index;
public Heap(int N) {
arr = new int[N];
index = 0;
}
public void add(int n) {
arr[index] = n;
addHeapify(index);
index++;
}
public int poll() {
if(index == 0)
return -1;
int result = arr[0];
arr[0] = arr[--index];
pollHeapify(0);
return result;
}
public void addHeapify(int idx) {
int parent = (idx - 1) >> 1;
if(parent < 0)
return;
if(arr[idx] > arr[parent]) {
swap(idx, parent);
addHeapify(parent);
}
}
public void pollHeapify(int idx) {
int p = idx;
int l = (idx << 1) + 1;
int r = (idx << 1) + 2;
if(l < index && arr[p] < arr[l]) {
p = l;
}
if(r < index && arr[p] < arr[r]) {
p = r;
}
if(p != idx) {
swap(idx, p);
pollHeapify(p);
}
}
public void swap(int a,int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public int size() {
return index;
}
}
public class Main {
static int[][] dis_oi;
static int N;
static int L;
static int P;
public static void main(String arg[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
dis_oi = new int[N][2]; //0 거리 1 기름
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
dis_oi[i][0] = Integer.parseInt(st.nextToken());
dis_oi[i][1] = Integer.parseInt(st.nextToken());
}
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
L = Integer.parseInt(st.nextToken()); //총 거리
P = Integer.parseInt(st.nextToken()); //기본 연료
Arrays.sort(dis_oi, (e1, e2) -> {
return e1[0] - e2[0];
});
int j = 0;
int cnt = 0;
Heap heap = new Heap(N);
while(P < L) {
while(j < N && P >= dis_oi[j][0]) { //다음 주유소 까지 갈 수 있다면 우선순위 큐에 추가
heap.add(dis_oi[j++][1]);
}
if(heap.size() == 0) { //모든 주유소에 방문했는데 p < L 이면
cnt = -1;
break;
}
else { //주유소에 방문하고 p연료를 보충(다음 주유소에 갈 수 있을 때 까지 반복)
cnt++;
P += heap.poll();
}
}
System.out.println(cnt);
}
}
'백준' 카테고리의 다른 글
[백준] 1939 중량제한 [자바] (0) | 2022.01.17 |
---|---|
[백준] 1442 숫자의 신 [자바] (0) | 2022.01.15 |
[백준] 1202 보석 도둑 [자바] (0) | 2022.01.09 |
[백준] 1655 가운데를 말해요 [자바] (0) | 2022.01.07 |
[백준] 1927 최소 힙 [자바] (0) | 2022.01.03 |