POJ 2431 贪心+优先队列

题意:一辆卡车距离重点L,现有油量P,卡车每前行1米耗费油量1,途中有一些加油站,问最少在几个加油站加油可使卡车到达终点或到达不了终点。
 
思路:运用优先队列,将能走到的加油站的油量加入优先队列中,油不够时加入优先队列中数值最大的油,如果油不够时队列里为空则到达不了。
 
 
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int> que;
struct Stop {
    int dis,fuel;
}stop[10010];
bool cmp (Stop a,Stop b) {
    if(a.dis==b.dis) return a.fuel>b.fuel;
    return a.dis<b.dis;
}
int main() {
    int n,L,p;
    while(~scanf("%d",&n)) {
        for(int i=0;i<n;i++) {
            scanf("%d%d",&stop[i].dis,&stop[i].fuel);
        }
        scanf("%d%d",&L,&p);
        for(int i=0;i<n;i++) {
            stop[i].dis=L-stop[i].dis;
        }
        sort(stop,stop+n,cmp);
        stop[n].dis=L;stop[n].fuel=0;
        int cnt=0,pos=0,flag=0;
        for(int i=0;i<=n;i++) {
            int d=stop[i].dis-pos;
            while(p<d) {
                if(!que.empty()) {
                    p+=que.top();
                    que.pop();
                    cnt++;
                }else break;
            }
            if(p<d) {
                flag=1;
                puts("-1");break;
            }
            p-=d;
            que.push(stop[i].fuel);
            pos=stop[i].dis;
        }
        if(flag==0) printf("%d\n",cnt);
        while(!que.empty()) que.pop();
    }
    return 0;
}

 

 
posted @ 2016-08-05 12:34  _LinesYao  阅读(148)  评论(0编辑  收藏  举报