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

Expedition

直接中文

Descriptions

一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队。作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱。卡车现在每运行一个单位的距离泄漏一个燃料单位。

为了修理卡车,奶牛需要沿着一条蜿蜒的长路行驶到最近的城镇(距离不超过1,000,000个单位)。在这条路上,在城镇和卡车的当前位置之间,有N(1 <= N <= 10,000)燃料站,奶牛可以停下来获得额外的燃料(每站1..100个单位)。

丛林对人类来说是一个危险的地方,对奶牛尤其危险。因此,奶牛希望在前往城镇的路上尽可能少地停下燃料。幸运的是,他们的卡车上的油箱容量非常大,实际上它可以容纳的燃油量没有限制。卡车目前距离城镇L单位,有P单位的燃料(1 <= P <= 1,000,000)。

确定到达城镇所需的最小停留次数,或者奶牛根本无法到达城镇。

Input

*第1行:单个整数,N

*行2..N + 1:每行包含两个以空格分隔的整数,用于描述燃料停止:第一个整数是从城镇到停靠点的距离; 第二个是该站点可用的燃料量。

*行N + 2:两个以空格分隔的整数,L和P.

Output

*第1行:一个整数,给出到达城镇所需的最少燃料停留次数。如果无法到达城镇,则输出-1。

Sample Input

4
4 4
5 2
11 5
15 10
25 10

Sample Output

2
2

Hint

输入细节:

卡车距离城镇25个单位; 这辆卡车有10个燃料单位。沿着这条路,距离城镇4,5,11和15的距离有4个燃料站(所以这些距离最初距离卡车的距离为21,20,14和10)。这些燃料停止装置可分别提供多达4个,2个,5个和10个单位的燃料。

输出细节:

驱动10个单位,停止再购买10个单位的燃料,再开4个单位,停止再购买5个单位的燃料,然后开车到镇上。

题目链接

https://vjudge.net/problem/POJ-2431

假如我经过一个加油站,我就获得了加这个站的油的权利,那么我可以一直走,一直走到没油,这时候取出我前面能加的油里面最多的那个加上继续走,讲这些加油站放入优先队列即可

AC代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 100000+5
using namespace std;
struct node
{
    int dis;//距离
    int value;//油
    bool operator<(const node &c)const//按距离从大到小排序
    {
        return dis>c.dis;
    }
};
node a[Maxn];
priority_queue<int>q;
int L,P,N;
int main()
{
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>a[i].dis>>a[i].value;
    cin>>L>>P;
    sort(a,a+N);//排序
    q.push(P);
    int ans=0,i=0;
    while(L>0&&!q.empty())
    {
        ans++;//用了几个加油站
        L-=q.top();
        q.pop();
        while(i<N&&L<=a[i].dis)//L<=a[i].dis,即进过加油站,存入队列
        {
            q.push(a[i].value);
            i++;
        }
    }
    if(L>0)
        cout<<-1<<endl;
    else
        cout<<ans-1<<endl;//第一次的油是自己的
    return 0;
}

原文地址:https://www.cnblogs.com/sky-stars/p/11332071.html

时间: 2024-10-10 19:43:56

【POJ - 2431】Expedition(优先队列)的相关文章

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

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 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 贪心+最大堆

当油量不够时从走过的油站中选最大加油量的 #include<iostream> #include<queue> #include<stdlib.h> #include<algorithm> using namespace std; #define MAX_N 10005 struct node{ int dist,fuel; }t[MAX_N]; bool cmp(const node &a,const node &b) { return a

poj - 2431 Expedition (优先队列)

http://poj.org/problem?id=2431 你需要驾驶一辆卡车做一次长途旅行,但是卡车每走一单位就会消耗掉一单位的油,如果没有油就走不了,为了修复卡车,卡车需要被开到距离最近的城镇,在当前位置和城镇之间有n个加油站可以加油. 为了减少危险,需要最少的加油次数,卡车的油箱可以看作无限大,卡车初始距离城镇L单位,自身有P单位的油. 注意输入的距离是与城镇的距离不是与开始点的距离.转换一下就好. 思想:把经过的所有加油站都加入优先队列,当燃料不足时就取出优先队列的最大元素,用来给卡车

poj 2431 Expedition (贪心加优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11538   Accepted: 3336 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 t

poj 2431 Expedition 贪心+优先队列

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7707   Accepted: 2263 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

题目传送门 题意:一辆卡车要行驶L长度,初始有P油,每行驶一个单位长度消耗一单位油.有n个加油站可以加油,问最少加油几次才能行驶L长度,如果不能输出-1 分析:按照挑战书的解法,每走到一个加油站相当于获得一次加油的权利,等到油没有的时候再选择之前可加油的站的最大油量加上,可以用优先队列高效得到最大值,如果队列里没油使得继续前进则为-1 收获:换一种思考方式,加上高效的数据结构能完美解决难题 代码: /************************************************

[POJ 2431]Expedition

1.题目连接:http://poj.org/problem?id=2431 2.题目大意:你需要开着一辆卡车行驶L单位距离,最开始卡车有P单位汽油,卡车每开一单位距离需要消耗1单位汽油,如果在中途卡车汽油耗尽,卡车就无法继续前行,到不了终点,在途中一共有n个加油站,告诉你每个加油站距离终点的距离和每个加油站可以加的油量,假设卡车的油箱是无穷大的,问卡车至少要加多少次油才能到达终点?卡车到不了终点输出-1 3.题目思路:使用优先队列+贪心思想完成此题,队列中维护到达目前的加油站之前没有用过的加油站

POJ 2431 Expedition (STL 优先权队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8053   Accepted: 2359 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(优先队列)

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 of di