原题链接 :http://poj.org/problem?id=2431
题目大意 : 一辆车从a出发到b,路上有n个加油站,给出加油站距离终点的距离和可以加的油,求最少加油次数。(车可以加无限多油)
思路: 用优先队列,每到一个地点就把加油站的油加入队列,当油不够到下一个节点时,从队列中选取最大的加油。
代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 using namespace std; struct node { int a,b; }a[10005]; bool cmp(node x,node y) { return x.a>y.a; } priority_queue <int> res; int main () { int n,m,i,t,j,k,sum=0;; scanf("%d",&n); for(i=0;i<n;++i) scanf("%d %d",&a[i].a,&a[i].b); scanf("%d %d",&j,&k); sort(a,a+n,cmp); a[n].a=0; a[n].b=0; ///将终点定义为距离为 0 油量为 0 的加油站 for (i=0;i<=n;++i) { if (j-a[i].a<=k) ///判断是否能到达当前加油站 { res.push(a[i].b); k=k-j+a[i].a; j=a[i].a; } else { sum++; ///如果不能到达,加油次数加一; i-- 重新进行上一步判断 if (!res.empty()){ k+=res.top(); res.pop(); i--; } else break; } } if (j==0) printf("%d ",sum); else printf("-1 "); return 0; }