poj 2431
题目大意:
给定N个加油站
给定N个加油站到终点的距离和给定其对应的油量
给定最终目的地的L距离,给定卡车所有的油量,假设对应的卡车可以装无限多的油
输出需要最少加油的次数
如果无法到达返回-1
思路:
1.卡车只要经过这个油站,就有机会加油,可以选择加或者不加
2.当卡车开过之后发现无法到达下一个目的地,我们可以认为他在之前经过某个加油站的时候就已经加过了油
3.为了让加油次数尽可能少,所以一定在经过的加油站中取最大的那个加油站,直至可以通过下一个站点
利用优先队列实现每次取经过的加油站的最大油值,表示在这个位置加过了油
#include<iostream>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node{
int dis;
int ful;
};
bool camp(const Node &a,const Node &b){
return a.dis<b.dis;
}
int main(){
const int MAXN =10024;
int N;
Node array[MAXN];
int Ns[MAXN];
int Ps[MAXN];
int L,P;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d %d",&array[i].dis,&array[i].ful);
}
scanf("%d %d",&L,&P);
//calculate the distence with start
for(int i=0;i<N;i++){
array[i].dis = L - array[i].dis;
}
sort(array,array+N,camp);
for(int i=0;i<N;i++){
Ns[i] = array[i].dis;
Ps[i] = array[i].ful;
}
Ns[N] = L;
Ps[N] = 0;
N++;
priority_queue<int> que;
int ans =0;
int pos =0;
int tank =P;
for(int i=0;i<N;i++){
int d = Ns[i] - pos;
while(tank - d<0){
if(que.empty()){
printf("%d\n",-1);
return 0;
}
tank+=que.top();
que.pop();
ans++;
}
//pos +=Ns[i]; error
pos = Ns[i];
tank-=d;
que.push(Ps[i]);
}
printf("%d\n",ans);
return 0;
}
cows
牛的复数
grabbed
攫取;捕获;强夺;匆忙地做(grab的过去分词形式
expedition
n. 远征;探险队;迅速