POJ2431(优先队列)

好吧,最近终于开始看点算法了,但还是停留在水题阶段:)

所以准备更新下看到的有意思的题(参考书籍:挑战程序竞赛 第二版)

这道题题目就不管了,我是先做了,又参考了下书上的解法,所以应该没有问题。

这道题是利用数据结构中的优先队列完成的。。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。本来优先队列应该是将数据插入队列后较小数据优先级高。  但C++中的优先队列为较大的元素优先级高,但这好像让这道题更容易了点。。。

其他的注意应该就是这道题的输入要注意一点。接下来贴一下源码。

 1 #include <iostream>
 2
 3 #include <cstdio>
 4
 5 #include <algorithm>
 6
 7 #include <queue>
 8
 9 using namespace std;
10
11 typedef pair<int, int> R;
12
13 int N, L, P;
14
15 R A[1000005];//用pair型存一下每个加油点到起点的距离及相应油量
16
17 void solve() {
18
19     int sumo = P; //从开始能向前走的距离
20
21     int count = 0;
22
23     priority_queue<int> que; //使用优先队列实现每次油量不足时取得存入的最大油量
24
25     for (int i = 0; i <= N; i++) {
26
27         while (sumo < A[i].first) {
28
29             if (que.empty()) {
30
31                 puts("-1");
32
33                 return;
34
35             }
36
37             else {
38
39                 sumo += que.top();
40
41                 que.pop();
42
43                 count++;
44
45             }
46
47         }
48
49         que.push(A[i].second);
50
51     }
52
53     cout << count << endl;
54
55 }
56
57
58 bool cmp(const R &a, const R &b) {
59
60     return a.first < b.first;
61
62 }
63
64
65
66 int main() {
67
68     cin >> N;
69
70     for (int i = 0; i < N; i++) {
71
72         cin >> A[i].first >> A[i].second;
73
74     }
75
76     cin >> L >> P;
77
78     for (int i = 0; i<N; i++)
79
80     {
81
82         A[i].first = L - A[i].first;
83
84     }
85
86     A[N] = R(L,0);
87
88     sort(A, A + N, cmp);
89
90     solve();
91
92     return 0;
93
94 }
时间: 2024-08-05 04:04:59

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

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

poj2431(优先队列)

注意题目给的是到终点的距离,需要转成到起点的距离,还有就是将终点也看成是加油站,这样写起来方便很多,不必要单独考虑最后一个加油站不在终点以后的情况 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; int N,P,L; pair<int,int> d[10

POJ-2431 优先队列

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

POJ2431 Expedition(排序+优先队列)

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

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 (优先队列)

题目链接: http://poj.org/problem?id=2431 题意: 一条路上有n个加油站,终点离起点的距离为L,然n个加油站离终点的距离为a[i],每个加油站可以给汽车加b[i]的油, 问最少加多少次可以到达终点,不能到达终点输出-1. 分析: 要想最少我们肯定是在马上要没有的时候加油,然后每次加的应该是最多的油. 因此我们走过第i个加油站的时候,把b[i]放入优先队列里,然后不能到达的时候 每次取出一个直到可以到达当前的位置,如果队列为空而且还不能动到达当前 位置则永远不可达.

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

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

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

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