Expedition---poj2431(优先队列-堆的实现)
题目链接:http://poj.org/problem?id=2431
题意:一辆卡车需要行驶 L 距离,车上油的含量为 P,在行驶的过程中有 n 个加油站 每个加油站到终点的距离是ai,每个加油站最多给卡车加 b 单位的油;求最后到达终点需要加油的最少次数;如果不能到达,输出-1;
我们可以从起点开始算,看每次油箱中的油是否能够到达下一个加油站,如果不能就加上已经经过的加油站的所能加的最大加油量,如果能到达,就记录一下此加油站可以被加进去;因为我们每次都需要加进去最大的加油
量,所以我们可以用优先队列;来存,那么每次取出来的就是最大值;
时间复杂度是O(n*logn)
用c++中的STL:
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define N 101000
#define INF 0xfffffff
using namespace std; int n, P, L, ans, f; struct node
{
int a,b;
} s[N]; int cmp(node n1,node n2)
{
return n1.a<n2.a;
} void slove()
{
priority_queue<int> Q;///优先队列; int pos = , i = ;///pos表示当前所在位置; while(i <= n)
{
int d = s[i].a - pos; while(Q.size() && P < d)///当不能到达下一个加油站时,要取出最大的加油量加进去;
{
int p = Q.top(); Q.pop();
P += p;
ans ++;
}
if(P >= d)
{
Q.push(s[i].b);
pos = s[i].a;
P -= d;
}
else
{
ans = -;
return ;
}
i ++;
}
} int main()
{
int i; while(scanf("%d",&n) != EOF)
{
memset(s, , sizeof(s)); ans=; for(i=; i<n; i++)
scanf("%d %d",&s[i].a, &s[i].b); scanf("%d %d", &L, &P); for(i=; i<n; i++)
s[i].a = L - s[i].a; s[i].a = L;
s[i].b = ;///把终点当成最后一个加油站处理; sort(s, s+n+, cmp); slove(); printf("%d\n", ans);
}
return ;
}
手写实现堆---优先队列;
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define N 11000
#define INF 0x3f3f3f3f
using namespace std; int Max_Heap[N], K;///K代表Max_Heap的个数;
int p; void Push(int x)///在最大堆中插入x;
{
Max_Heap[K++] = x;///放到最后一个节点处; int t = K-; while(Max_Heap[t] > Max_Heap[t/] )///当它的值大于它的父节点的值时,要交换一下位置;
{
swap(Max_Heap[t], Max_Heap[t/]);
t = t/;
}
}
void Pop()
{
K --;///删除元素,堆中总个数减一; Max_Heap[] = Max_Heap[K];///把最后一个数放到最上面,然后一步一步往下更新堆; Max_Heap[K] = -;///防止越界,相当于建立哨兵; int t = ;///从第一个节点开始往下更新; while( Max_Heap[t] < Max_Heap[t*] || Max_Heap[t] < Max_Heap[t*+])
{
if(Max_Heap[t] < Max_Heap[t*] && Max_Heap[t*] > Max_Heap[t*+])
{///左儿子大于它时,并且满足左儿子大于右儿子,让左儿子上去;
swap(Max_Heap[t], Max_Heap[t*]);
t = t*;
}
else
{
swap(Max_Heap[t], Max_Heap[t*+]);
t = t* + ;
}
}
} int n, P, L, ans, f; struct node
{
int a,b;
} s[N]; int cmp(node n1,node n2)
{
return n1.a<n2.a;
} void slove()
{
memset(Max_Heap, -, sizeof(Max_Heap)); Max_Heap[] = INF; K = ; int pos = , i = ; while(i <= n)
{
int d = s[i].a - pos; while(K!= && P < d)
{
int p = Max_Heap[];
Pop();
P += p;
ans ++;
}
if(P >= d)
{
Push(s[i].b);
pos = s[i].a;
P -= d;
}
else
{
ans = -;
return ;
}
i ++;
}
} int main()
{
int i; while(scanf("%d",&n) != EOF)
{
memset(s, , sizeof(s)); ans=; for(i=; i<n; i++)
scanf("%d %d",&s[i].a, &s[i].b); scanf("%d %d", &L, &P); for(i=; i<n; i++)
s[i].a = L - s[i].a; s[i].a = L;
s[i].b = ; sort(s, s+n+, cmp); slove(); printf("%d\n", ans);
}
return ;
}
Expedition---poj2431(优先队列-堆的实现)的更多相关文章
- POJ2431 Expedition(排序+优先队列)
思路:先把加油站按升序排列. 在经过加油站时.往优先队列里增加B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.假设队列为空(能够理解成预存储的油量),则无法到达下一个加油站,更无法到 ...
- 【POJ - 2431】Expedition(优先队列)
Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...
- POJ2431 优先队列+贪心 - biaobiao88
以下代码可对结构体数组中的元素进行排序,也差不多算是一个小小的模板了吧 #include<iostream> #include<algorithm> using namespa ...
- Java学习笔记--PriorityQueue(优先队列)(堆)
PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...
- c++优先队列(堆)
1.最小堆.最大堆 priority_queue<int,vector<int>,greater<int> > f; //最小堆(后面的数逐渐greater) pr ...
- POJ 2431 Expedition (优先队列+贪心)
题目链接 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. ...
- poj 2431 Expedition 贪心+优先队列 很好很好的一道题!!!
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10025 Accepted: 2918 Descr ...
- 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序
剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...
- POJ 2431 Expedition(优先队列、贪心)
题目链接: 传送门 Expedition Time Limit: 1000MS Memory Limit: 65536K 题目描述 驾驶一辆卡车行驶L单位距离.最开始有P单位的汽油.卡车每开1 ...
随机推荐
- mysqldump: command not found
原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件.首先得知道mysql命 ...
- windows,cmd中查看当前目录下的文件及文件夹
需求描述: 在使用cmd的过程中,有的时候需要查看当前目录下有哪些文件或者文件夹,类似linux下的ls命令 操作过程: 1.通过dir命令查看当前目录下有哪些的文件及文件夹 备注:通过dir命令,就 ...
- 非常不错的前端框架Kendo-ui
近期公司在做重构,准备换前端框架由Extjs换kendo-ui,问什么要换框架呢?主要有以下几个原因: Extjs太重,偏向后端语言,前端写起来费劲 Extjs执行太慢(这是主要原因),因为Extjs ...
- makefile--变量的使用(二)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 仔细研究我们的之前Makefile发现,我们还有改进的地方,就是此处: target_bin : ...
- oracle_存储过程_没有参数_更新过期申请单以及写日志事务回滚
CREATE OR REPLACE PROCEDURE A_MEAS_MIINSP_PLAN_UPDATEASvs_msg VARCHAR2(4000);log_body VARCHAR2(400); ...
- ssh&scp指定密钥
scp时指定密钥: scp -P22 -r -i ~/.ssh/dongjing-shanghai.pem root@kiri_pro01:/data/backup/back_from_japan ...
- laravel 集合接口
只记下几个常用的,其他的看这里:http://laravelacademy.org/post/6293.html 1)什么是集合? 就是laravel查询构建器查询返回的数据结果(get first ...
- 淘宝cnpm(可替代nodejs默认npm)
淘宝 NPM 镜像 这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步. https://npm.taobao.org/
- CentOS5.5环境下布署LVS+keepalived
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kerry.blog.51cto.com/172631/401253 #!/bin ...
- lua和C++交互的lua栈操作——以LuaTinker为例
一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...