题目地址:POJ 2431
将路过的加油站的加油量放到一个优先队列里,每次当油量不够时,就一直加队列里油量最大的直到能够到达下一站为止。
代码例如以下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; struct node { int d, p; }stop[11000]; int cmp(node x, node y) { return x.d<y.d; } int main() { int n, i, j, l, p, flag=0, s, cnt; scanf("%d",&n); priority_queue<int>q; for(i=0;i<n;i++) { scanf("%d%d",&stop[i].d,&stop[i].p); } scanf("%d%d",&l,&p); for(i=0;i<n;i++) { stop[i].d=l-stop[i].d; } stop[n].d=l; stop[n].p=0; sort(stop,stop+n+1,cmp); cnt=0; for(i=0;i<=n;i++) { if(stop[i].d<0) continue ; if(p<stop[i].d) { while(!q.empty()&&p<stop[i].d) { p+=q.top(); q.pop(); cnt++; } if(p<stop[i].d) { flag=1; break; } } q.push(stop[i].p); } if(flag) puts("-1"); else printf("%d\n",cnt); return 0; }