汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。

沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 station[i][1] 升汽油。

假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。

当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。

为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回 -1 。

注意:如果汽车到达加油站时剩余燃料为 0,它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为 0,仍然认为它已经到达目的地。

输入:target = 1, startFuel = 1, stations = []
输出:0
解释:我们可以在不加油的情况下到达目的地。
输入:target = 100, startFuel = 1, stations = [[10,100]]
输出:-1
解释:我们无法抵达目的地,甚至无法到达第一个加油站。
输入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]
输出:2
解释:
我们出发时有 10 升燃料。
我们开车来到距起点 10 英里处的加油站,消耗 10 升燃料。将汽油从 0 升加到 60 升。
然后,我们从 10 英里处的加油站开到 60 英里处的加油站(消耗 50 升燃料),
并将汽油从 10 升加到 50 升。然后我们开车抵达目的地。
我们沿途在1两个加油站停靠,所以返回 2 。

一开始想的是在每次可以走的最远的路程所经过的加油站中选择一个油量最大的,但是忽略了可能加一次油到不了下一站,或者下下一站。因此需要循环找第二大油量,甚至第3,4,5....大的油量
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
bool vis[1000];int go(int maxdis,vector< vector<int> >& stations)
{int mx=0,pos=-1,num=stations.size(),i=0;while(i<num&&stations[i][0]<=maxdis){if(stations[i][1]>mx&&!vis[i]){mx=stations[i][1];pos=i;}i++;}if(pos==-1)return -1;else{vis[pos]=1;return mx;}}
int minRefuelStops(int target, int startFuel, vector< vector<int> >& stations) {memset(vis,0,sizeof(vis));//把终点当作一个加油站vector<int>v;v.push_back(target);v.push_back(0);stations.push_back(v);int num=stations.size();//cout<<num<<endl;if(startFuel>=target)return 0;else{//beg是当前加油的下标,i是可以走到的加油站下标int dis=startFuel,i=0,start=0,cou=0,beg=0;while(start+dis<target){//cout<<"start: "<<start<<"  "<<i<<endl;//计算每次行驶完所有的汽油后可以经过的加油站,在含油量最高的加油站处加油//cout<<stations[i][0]<<endl;int mx=0,po=-1;int maxdis=start+dis;  //可以走的最远距离//找出第一个到达不了的加油站while(i<num&&stations[i][0]<=maxdis){i++;}//不断加油直到可以走到while(i<num&&start+dis<stations[i][0]){int tmp=go(maxdis, stations);if(tmp!=-1){dis+=tmp;cou++;}elsebreak;}if(start+dis>=stations[i][0]){dis-=(stations[i][0]-start);start=stations[i][0];beg=i;}elsebreak;}if(start+dis>=target)return cou;elsereturn -1;}
}int main()
{vector< vector<int> > stations;int target,startFuel;while(1){scanf("%d%d",&target,&startFuel);vector<int>s;s.push_back(14);s.push_back(123);stations.push_back(s);s.clear();s.push_back(145);s.push_back(203);stations.push_back(s);s.clear();s.push_back(344);s.push_back(26);stations.push_back(s);s.clear();s.push_back(357);s.push_back(68);stations.push_back(s);s.clear();s.push_back(390);s.push_back(35);stations.push_back(s);s.clear();s.push_back(478);s.push_back(135);stations.push_back(s);s.clear();s.push_back(685);s.push_back(108);stations.push_back(s);s.clear();s.push_back(823);s.push_back(186);stations.push_back(s);s.clear();s.push_back(934);s.push_back(217);stations.push_back(s);s.clear();s.push_back(959);s.push_back(80);stations.push_back(s);printf("%d\n",minRefuelStops(target,startFuel,stations));}
}

转载于:https://www.cnblogs.com/flightless/p/10427756.html

871 最低加油次数相关推荐

  1. LeetCode 871. 最低加油次数

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

  2. 79. Leetcode 871. 最低加油次数 (堆-技巧三-事后小诸葛)

    技巧三 - 事后小诸葛这个技巧指的是:当从左到右遍历的时候,我们是不知道右边是什么的,需要等到你到了右边之后才知道.如果想知道右边是什么,一种简单的方式是遍历两次,第一次遍历将数据记录下来,当第二次遍 ...

  3. 871. 最低加油次数

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

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

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

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

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

  6. [Swift]LeetCode871. 最低加油次数 | Minimum Number of Refueling Stops

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. Minimum Number of Refueling Stops(C++最低加油次数)

    参考网址:https://leetcode.com/problems/minimum-number-of-refueling-stops/discuss/149839/DP-O(N2)-and-Pri ...

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

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

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

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

最新文章

  1. dhcpd命令--Linux命令应用大词典729个命令解读
  2. 解决protobuf import路径的问题
  3. STM32之NVIC的深入详解
  4. GridView的操作大全
  5. mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...
  6. 2016版系统集成项目管理工程师考试题型举例
  7. 系统吞吐量评估方法 冯凌圣
  8. Shiro 支持三种方式的授权
  9. 理解JVM(五):Java内存模型与线程
  10. 菜鸟教程python100例-菜鸟教程python
  11. Java Restful风格-Jersey RESTful 框架入门
  12. 报童问题求解最大利润_Ortools调用第三方求解器
  13. SOLIDWORKS工程图导出DWG图纸时图层映射关系
  14. 如何用python爬取公众号文章搜狗微信搜索_基于搜狗微信搜索的微信公众号爬虫 – we......
  15. tpadmin隐藏index.php,百度云服务器tp5框架布署,隐藏路径中的index.php
  16. SMILES Enumeration
  17. 驾考科目三考试经验谈
  18. 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
  19. 解决超微主板双卡显示器不亮问题
  20. linux win95模拟,Windows 95模拟器

热门文章

  1. docker部署项目 入门版
  2. Raspberry Pi 4B 颜色检测
  3. 设置cookie存活时间_Django之cookie、session、token
  4. java数组实验报告_Java实验一实验报告
  5. proDAD Erazr便携版
  6. python爬虫不错的文章
  7. virtualenv wrapper安装配置
  8. PHP 的一些开发规范
  9. python爬虫requests json与字典对象互相转换
  10. MVC Filter