题目大意是说你需要开车走L长的路,最开始有P单位油,你每走一个单位路程会消耗一个单位油。现在在路上有一些加油站,分别知道他们距终点的距离以及能够从他们那获得多少油。问你使用这些加油站能否到达加油站,若不能,输出-1,若能,则输出最少的加油次数
其实可以这样想,每经过一个加油站假设现在可以加这个加油站所提供的油,然后当汽车油为0的时候,总是选择前面经过的加油站能够提供最多油的加油站进行加油,因为要求求出次数最少,所以不难发现每次加油要尽可能的多。所以很容易想到优先队列解题~剩下的就比较简单了~
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<algorithm> using namespace std; const int maxn=11000; struct Node { int pos; int val; bool operator <(const Node &a)const { return val<a.val; } }a[maxn]; int n,l,p; priority_queue<Node> q; bool cmp(Node a,Node b) { return a.pos<b.pos; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d",&a[i].pos,&a[i].val); scanf("%d%d",&l,&p); for(int i=0;i<n;i++) a[i].pos=l-a[i].pos; a[n].pos=l; a[n++].val=0; sort(a,a+n,cmp); while(!q.empty()) q.pop(); int ans=0,res=p; bool isans=0; for(int i=0;i<n;i++) { if(res>=a[i].pos) q.push((Node){a[i].pos,a[i].val}); else { while(res<a[i].pos) { if(q.empty()) { isans=1; break; } ans++; res+=q.top().val; q.pop(); } if(!isans) q.push((Node){a[i].pos,a[i].val}); } } if(isans) printf("-1\n"); else printf("%d\n",ans); } return 0; }