码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2431 贪心+优先队列

时间:2016-08-05 13:42:22      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

题意:一辆卡车距离重点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;
}

 

 

POJ 2431 贪心+优先队列

标签:

原文地址:http://www.cnblogs.com/LinesYao/p/5740854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!