原题链接
解题思路
在到达加油站 i 时,就获得了一次在之后的任何时候都可以加Bi 单位汽油的权利。每次从优先队列中取出最大的汽油。
· 在经过加油站 i 时,向优先队列中加入Bi
· 当燃料箱空时,如果优先队列也是空的,则无法到达终点。否则取出优先队列中最大的元素,给卡车加油
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class POJ2431{
static int[] c = new int[10005];
static int[] d = new int[10005];
static int[] a = new int[10005];
static int[] b = new int[10005];
static int n,L,P;
/*
static Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 0; i < n; i++) {
c[i] = sc.nextInt();
d[i] = sc.nextInt();
}
L = sc.nextInt();
P = sc.nextInt();
int t = n - 1;
for(int i = 0; i < n; i++) {
a[t] = L - c[i];
b[t] = d[i];
t--;
}
// 终点也是加油站
a[n] = L;
b[n] = 0;
n++;
int ans = 0; //加油的次数
int pos = 0; //现在位置
int rank = P; //油量
//Queue<Integer> que = new PriorityQueue<>(cmp);
// 从大到小排序
Queue<Integer> que=new PriorityQueue<Integer>(new Comparator<Integer>(){
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
});
for(int i = 0; i < n; i++) {
int d = a[i] - pos;
while(rank - d < 0) {
if(que.isEmpty()) {
System.out.println("-1");
return;
}
rank += que.poll();
ans++;
}
rank -= d;
pos = a[i];
que.add(b[i]);
}
System.out.println(ans);
}
}
来源:CSDN
作者:ACMER.
链接:https://blog.csdn.net/weixin_43588422/article/details/104033793