分析:这里最笨的方法是使用递归下的深度优先搜索(为啥感觉好像每个题目都可以深度搜索一样,蜜汁尴尬),对于每个加油站,有加油和不加油两个选择。然而在看到限制条件中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. 几道加油站加油相关问题:最小加油次数、能否回到起点

    几道加油站加油相关问题 1.选一个加油站能走完一圈:leetcode134. Gas Station 2.加油最少次数(easy) 3.加油最少次数(hard):leetcode871. Minimu ...

  2. 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。

    算法课的课堂测试,问题大概就是这些描述. 动态规划旅游问题: 汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案. 我的代码: #include<iostr ...

  3. 【871. 最低加油次数】

    来源:力扣(LeetCode) 描述: 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 sta ...

  4. POJ2431贪心(最少加油次数)

    题意:        给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...

  5. LeetCode 871. Minimum Number of Refueling Stops 最少加油次数

    LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...

  6. 871 最低加油次数

    汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...

  7. 贪心应用--汽车加油次数问题

    文章目录 1. 问题描述 2. 解题思路 3. 实现代码 4. 测试结果 1. 问题描述 已知汽车的油箱额定里程,到目的地的路途中各加油站距起点的距离,求如何加油,让加油的次数最少. 2. 解题思路 ...

  8. LeetCode 871. 最低加油次数

    最近刷LeetCode题目的一些思路,题目信息 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 ...

  9. LeetCode(871):最低加油次数 Minimum Number of Refueling Stops(Java)

    2019.7.25 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 这道智力题让我想起了LeetCode 871:加油站. 可以很容易能够想到用回溯法来做,每次经过加油站选择加 ...

最新文章

  1. appcan+html查看效果,appcan常用的窗口方法
  2. 概述---《TCP/IP协议》卷一 练习题
  3. Apollo客户端读取数据原理
  4. java如果属性为空返回其他_后台返回前台数据(实体类)如果存在为空或‘’的属性,如何过滤掉...
  5. html关于拖放叙述错误,CIW页面设计与制作HTML附答案
  6. html编辑器查找与替换,织梦kindeditor文本编辑器增加“查找替换”功能
  7. 小米9 Pro 5G评测:史上最低价5G手机
  8. python 二分查找_Python实现二分法搜索
  9. 为什么程序员愿意加入管理糟糕的创业公司?
  10. 蓝桥杯2016年第七届C/C++A组省赛第二题-生日蜡烛
  11. darknet 的python接口使用
  12. 怎么把excel表格内的数据导入数据库?
  13. VS错误的解决办法:error LNK2019: 无法解析的外部符号
  14. JAVA程序设计的一次作业
  15. vm9.02的序列号
  16. 正则表达式 java 截取指定字符中间的字符串
  17. windows环境下,搭建RTSP视频推流服务器
  18. 锂镍钴价格齐飞,新能源汽车涨价潮何时休?
  19. ubuntu16.04 360随身WiFi2
  20. matlab 画柱状图和误差棒,小白1分钟绘图:带误差棒的柱状图

热门文章

  1. curl证书过期_定时检测SSL证书过期情况并发送通知
  2. iOS设备指纹的前世今生
  3. electron初学之随机点名
  4. Digital Asset与国际衍生品协会携手,布局智能合约在衍生品交易中的使用
  5. 【APICloud系列|1】华为应用市场 应用版权证书或代理证书怎么填
  6. 下一代防火墙(NGFW)如何防御APT攻击?
  7. 佳沛奇异果猕猴桃扫盲
  8. AI 仿人类人工智能(超级智能)的本质
  9. Ratel不进行预测,一段时间后恢复正常
  10. 录入年、月、日,判断日期的合法性