优先队列之加油站最小加油次数
分析:这里最笨的方法是使用递归下的深度优先搜索(为啥感觉好像每个题目都可以深度搜索一样,蜜汁尴尬),对于每个加油站,有加油和不加油两个选择。然而在看到限制条件中1<=N<=10000后,我知道这种方法显然不可取了,即便可以在大于已知最小次数时进行剪枝,可是效率仍然是非常低的。
我们结合下实际情况:我们想象下,车子在还有油时,不断向前行驶,每遇到一个加油站i时,都把Bi量的油放在车上,注意这并不是给油缸加油,只是相当于放在后备箱了,然后在车子没有油时,从后备箱选择一个油量最大的进行加油,这样不断重复,在后备箱中已经没有油,但是还没到终点,那么就不能到终点了,也就是输出-1。比较类似贪心,每次选择一个对当前情况最有利的情况。
在进行选择后备箱的油时,当然可以使用循环不断比较后获得最大油量,可是没必要,我们可以使用C++的STL库中的一个数据结构---优先队列priority_queue,每次把油加入后备箱时,都会自动按int类型键值从大到小排序,然后每次从后备箱取油时,会自动返回最大油量.下面是源代码:
#include<iostream>
#include<queue>
using namespace std;
#define Max 10000
int n,l,p;
int A[Max],B[Max];
int solve()
{ //ans表示最后结果,即最小加油次数 //pos表示当前卡车位置 //tank表示油缸中油的数量 //que优先队列中存放之前能通过的各个加油站的最大加油量Bi priority_queue<pair<int,int> > que; int ans=0,pos=0,tank=p; for(int i=0;i<n;i++) { int curDist=A[i]-pos; //curDist表示到达下一个临时终点(加油站)的距离 while(curDist>tank) //当前油不够到下一个终点 { if(que.empty()) { //cout<<"无法到达终点~"<<endl; return -1; } pair<int,int> temp=que.top(); que.pop(); tank+=temp.first; //不断加油,直到能到达下一个终点 cout<<temp.second+1<<" "; ans++; } tank-=curDist; //跑到下一个终点,消耗 curDist数量的油 pos=A[i]; //到达下一个加油站,取得该加油站的油,放在优先队列中,以便后面使用 que.push(make_pair(B[i],i)); } cout<<endl; return ans;
}
int main()
{ cin>>n>>l>>p; for(int i=0;i<n;i++) { cin>>A[i]>>B[i]; } cout<<"加油的站点的编号:"; cout<<solve(); return 0;
}
PS:开学之后,博客可能没办法像寒假一样频繁地更新,虽然最近每天看的内容挺多,但是很多是原来基础的一些数据结构的知识,开学后,我会有选择地写下比较有代表性或者有自己心得的博客。
优先队列之加油站最小加油次数相关推荐
- 几道加油站加油相关问题:最小加油次数、能否回到起点
几道加油站加油相关问题 1.选一个加油站能走完一圈:leetcode134. Gas Station 2.加油最少次数(easy) 3.加油最少次数(hard):leetcode871. Minimu ...
- 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。
算法课的课堂测试,问题大概就是这些描述. 动态规划旅游问题: 汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案. 我的代码: #include<iostr ...
- 【871. 最低加油次数】
来源:力扣(LeetCode) 描述: 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 sta ...
- POJ2431贪心(最少加油次数)
题意: 给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...
- LeetCode 871. Minimum Number of Refueling Stops 最少加油次数
LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...
- 871 最低加油次数
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...
- 贪心应用--汽车加油次数问题
文章目录 1. 问题描述 2. 解题思路 3. 实现代码 4. 测试结果 1. 问题描述 已知汽车的油箱额定里程,到目的地的路途中各加油站距起点的距离,求如何加油,让加油的次数最少. 2. 解题思路 ...
- LeetCode 871. 最低加油次数
最近刷LeetCode题目的一些思路,题目信息 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 ...
- LeetCode(871):最低加油次数 Minimum Number of Refueling Stops(Java)
2019.7.25 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 这道智力题让我想起了LeetCode 871:加油站. 可以很容易能够想到用回溯法来做,每次经过加油站选择加 ...
最新文章
- appcan+html查看效果,appcan常用的窗口方法
- 概述---《TCP/IP协议》卷一 练习题
- Apollo客户端读取数据原理
- java如果属性为空返回其他_后台返回前台数据(实体类)如果存在为空或‘’的属性,如何过滤掉...
- html关于拖放叙述错误,CIW页面设计与制作HTML附答案
- html编辑器查找与替换,织梦kindeditor文本编辑器增加“查找替换”功能
- 小米9 Pro 5G评测:史上最低价5G手机
- python 二分查找_Python实现二分法搜索
- 为什么程序员愿意加入管理糟糕的创业公司?
- 蓝桥杯2016年第七届C/C++A组省赛第二题-生日蜡烛
- darknet 的python接口使用
- 怎么把excel表格内的数据导入数据库?
- VS错误的解决办法:error LNK2019: 无法解析的外部符号
- JAVA程序设计的一次作业
- vm9.02的序列号
- 正则表达式 java 截取指定字符中间的字符串
- windows环境下,搭建RTSP视频推流服务器
- 锂镍钴价格齐飞,新能源汽车涨价潮何时休?
- ubuntu16.04 360随身WiFi2
- matlab 画柱状图和误差棒,小白1分钟绘图:带误差棒的柱状图