POJ2431 Expedition (优先队列)

题目链接:

http://poj.org/problem?id=2431

题意:

一条路上有n个加油站,终点离起点的距离为L,然n个加油站离终点的距离为a[i],每个加油站可以给汽车加b[i]的油,

问最少加多少次可以到达终点,不能到达终点输出-1。

分析:

要想最少我们肯定是在马上要没有的时候加油,然后每次加的应该是最多的油。

因此我们走过第i个加油站的时候,把b[i]放入优先队列里,然后不能到达的时候

每次取出一个直到可以到达当前的位置,如果队列为空而且还不能动到达当前

位置则永远不可达。

代码如下:

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

const int maxn = 1000010;

struct stop {
    int a,b;
    bool operator <(const struct stop &tmp)const {
        return a<tmp.a;
    }
} p[maxn];

int n,l,pp;

void solve()
{
    p[n].a=l,p[n].b=0;
    sort(p,p+n+1);
    int tot = pp;
    priority_queue<int >Q;
    while(!Q.empty()) Q.pop();
    int ans = 0,pos=0,tag=0;
    for(int i=0; i<=n; i++) {
        int dis = p[i].a-pos;
        while(tot<dis) {
            if(Q.empty()) {
                printf("-1\n");
                return;
            }
            tot+=Q.top();
            Q.pop();
            ans++;
        }
        tot-=dis;
        pos=p[i].a;
        Q.push(p[i].b);
        //printf("tot: %d\n",tot);
    }
    printf("%d\n",ans);
    return ;
}
int main()
{
    while(~scanf("%d",&n)) {
        int a,b;
        for(int i=0; i<n; i++)
            scanf("%d%d",&p[i].a,&p[i].b);
        scanf("%d%d",&l,&pp);
        for(int i=0; i<n; i++)
            p[i].a=l-p[i].a;
        solve();
    }
    return 0;
}
/***
4
4 4
5 2
11 5
15 10
25 10
***/
时间: 2024-09-28 17:01:17

POJ2431 Expedition (优先队列)的相关文章

poj2431 Expedition优先队列

Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel ever

poj2431 Expedition (优先队列) 挑战程序设计竞赛

题目链接:http://poj.org/problem?id=2431 Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9148   Accepted: 2673 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor driver

POJ2431 Expedition(排序+优先队列)

思路:先把加油站按升序排列. 在经过加油站时,往优先队列里加入B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.如果队列为空(可以理解成预存储的油量),则无法到达下一个加油站,更无法到达目的地. 2.否则就取出队列里的最大元素,来给汽车加油(贪心思想) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue>

H - Expedition 优先队列 贪心

来源poj2431 A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel every

POJ2431(优先队列)

好吧,最近终于开始看点算法了,但还是停留在水题阶段:) 所以准备更新下看到的有意思的题(参考书籍:挑战程序竞赛 第二版) 这道题题目就不管了,我是先做了,又参考了下书上的解法,所以应该没有问题. 这道题是利用数据结构中的优先队列完成的..在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征.本来优先队列应该是将数据插入队列后较小数据优先级高.  但C++中的优先队列为较大的元素优先级高,但这好

POJ2431 Expedition

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7349   Accepted: 2179 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

poj 2431 Expedition(优先队列)

题目链接 http://poj.org/problem?id=2431 Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9243   Accepted: 2700 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor driver

EXPEDI - Expedition 优先队列

题目描述 A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel every unit

【POJ - 2431】Expedition(优先队列)

Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离泄漏一个燃料单位. 为了修理卡车,奶牛需要沿着一条蜿蜒的长路行驶到最近的城镇(距离不超过1,000,000个单位).在这条路上,在城镇和卡车的当前位置之间,有N(1 <= N <= 10,000)燃料站,奶牛可以停下来获得额外的燃料(每站1..100个单位). 丛林对人类来说是一个危险的地方,对奶