一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。

  要求:

  输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。

  输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。

贪心算法(又称贪婪算法),是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。

贪心算法不是对所有的问题都能得到整体最优解,关键是贪心算法策略的选择。也就是说,不从整体最优上加以考虑,做出的知识在某种意义上的局部最优解。

对于加油站问题的解法来说,每次只走一小站,然后此处这两站之间的问题就是整体的问题的一个局部。到底怎样才能走到下一站呢?这是我们解决这个问题的关键,在一个加油站可以选择加油或者不加油,如若在每一个加油站都加油的话,在两个加油站之间的距离是加油后能走距离的最大距离,那肯定可以运动到最后一个加油站,但显而易见的是,这种想法肯定不是最优解,当我们在第k个加油站时,无论时候能走完k站与k+1站之间的距离都去选择加油,而实际上,当此时剩下的油量所能走过的路程大于k-k+1加油站距离时是可以选择不加油的,只有必须加油的时候才选择加油,这样才能最大限度的降低加油的次数,也就可以得到最少加油次数,即最优解。

举个例子来说:(n=5,k=3,dis=[ 3,4,2,1 ])

如图,红圈代表加油站,中间 3个加油站,现在需要从第0个加油站运动到第k+1个(即第4个)加油站的距离,dis数组用来存放加油站之间的间隔距离,count=0用来记录需要的最少加油次数,s=n用来代表此时的油量还可供走过多少的路程(初始状态为加满油,则初始赋值为加满油的最大距离n)。

k=0(初始状态): s=n=5, count=0

s > dis[0]=3(判断能否到下一个加油站,不能则无解)

此时能,则 s=s-dis[0]=5-3=2;

k=1: s=2,n=5,count=0

s < dis[1]=4 (判断能否到下一个加油站,能则不加油)

此时不能,则加满油, s=n=5,count=count+1=1,

s>dis[1]=4,则s =s-dis[1]=5-4=1,

k=2:s=1,n=5,count=1

s < dis[2]=2 (判断能否到下一个加油站,能则不加油)

此时不能,则加满油, s=n=5,count=count+1=2,

s>dis[2]=2,则s =s-dis[2]=5-2=3,

k=3:s=3,n=5,count=2

s > dis[3]=1 (判断能否到下一个加油站,能则不加油)

此时能,s =s-dis[3]=3-1=2,

最终,count=2,则最少加油次数为2.

附上个人代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>let n = +prompt("请输入加满油后可以行驶的距离n:");let k = +prompt("请输入加满站的数量k:");let str = prompt("请输入一行用逗号分割的整数表示加油站之间的距离:");let dis = str.split(",");function gasStation(n, k, dis) {let count = 0;let s = n;if (dis[0] > n) {return -1;}for (let i = 0; i <= k; i++) {if (s >= parseInt(dis[i])) {s -= parseInt(dis[i]);} else {s = n;if (s < parseInt(dis[i])) {count = -1;break;}s -= parseInt(dis[i]);count++;}}return count;}let count = gasStation(n, k, dis);if (count == -1) {console.log("NoSolution");} else {console.log("最少加油次数为:" + count);}</script></body>
</html>

加油站问题-贪心算法(面试题JS)相关推荐

  1. 134. 加油站(贪心算法)

    在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其中的一个加 ...

  2. 贪心算法--加油站问题

    一个汽车加满油后可以行使n千米,图中会经过一系列加油站,求到达最终加油的最少次数,给出每个加油站之间的距离. #include<stdio.h> #define n 7//n表示汽车加满油 ...

  3. C语言经典贪心算法之加油站问题(详解)

    文章目录 一.贪心算法 二.加油站问题 一.贪心算法 贪心算法暗示一种不追求最优解,只希望找到较为满意解的方法.贪心算法省去了为找最优解要穷尽所有可能而必须耗费大量时间,因此它一般可以快速得到较为满意 ...

  4. js贪心算法---背包问题

    /** @param {Object} capacity 背包容量 6* @param {Object} weights 物品重量 [2,3,4]* @param {Object} values 物品 ...

  5. JS贪心算法,含图解

    贪心算法概念 心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最 ...

  6. python【蓝桥杯vip练习题库】BASIC-19完美的代价(贪心算法)

    试题 基础练习 完美的代价 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串, ...

  7. 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...

    马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...

  8. 算法分析与设计-实验三 贪心算法设计

    文章目录 1.最优服务次序问题 2.区间相交问题 3.汽车加油问题 4.活动安排问题:考虑将一系列活动安排在科学会堂.假设有n个活动,每个活动需要花费一个单位时间.如果在时间T[i]或T[i]之前开始 ...

  9. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

最新文章

  1. python3.6.5安装教程-[教程]Centos下使用Yum安装python3.6.5
  2. Linux系统调用-- mount/umount函数详解
  3. UI Blue crystall class sap_bluecrystal is added here to html node
  4. php验证码图片乱码,php ,验证码图片,乱码
  5. 图书管理系统详细设计说明书_书城管理系统不同模块在图书管理中体现不同作用...
  6. 一个带CheckBox的树形目录的递归算法(javascript)
  7. Shell 脚本语法
  8. MFC 创建快捷方式(学习笔记)
  9. 深入学习Java虚拟机(三)
  10. html json编辑器,JSON.html HTML Editor
  11. 外挂制作--------NP认识
  12. 动态规划之完全背包和多重背包
  13. Poco库使用:操作Json格式数据
  14. 大厂Offer拿到手软啊!隔壁都馋哭了
  15. vue 定时刷新按钮控制
  16. GEE6:获取每年水体数据
  17. 推特开发者账号 申请失败 【推特爬虫技术分享1】获取推文评论数量
  18. 【雕爷学编程】Arduino动手做(74)---6MV2飞控GPS模块
  19. 简单的签到代码_Python自动签到
  20. 一个mac地址对应多个ip_子接口的配置(一个网卡配置多个ip地址)

热门文章

  1. 基于MDKA5D31-EK_T70开发板的QT示例-demo03:WeatherDate
  2. linux 冒号的作用
  3. .Net Core IFormFile 始终为空的问题
  4. 百度地图显示空白(只有格子)的解决方法
  5. OpenGL——透视
  6. [离散时间信号处理学习笔记] 13. 重采样
  7. STM32F10x互补输出TIM_OutputState,TIM_OutputNState的意思
  8. 富华力鼎:抖音短视频的运营技巧
  9. MySQL数据操作之高级查询——别名、去重、where子句、排序
  10. js 获取时间戳的方式 及使用时间搓生成的永远不会重复的id