【贪心算法】绿洲之旅:最少次数补给探索

news/2024/11/24 8:46:57/

文章目录

        • 问题背景
        • 解决思路
        • 贪心算法的优势
        • 实现步骤详解

问题背景

假设一位旅行者需要穿越一片沙漠,起点到终点的距离为 D 公里,旅行者初始携带了 W 升水,每前进一公里需要消耗一升水。在穿越过程中,沿途会经过 N 个补给站,补给站的位置和可提供的水量分别由数组 positionsupply 描述。

旅行者的目标是用最少的补给次数到达终点。如果在某个时刻发现无法前行,则无法完成任务,输出 -1。

在这一问题中,我们需要兼顾两个核心点:

  1. 每次补给的时机:选择适当的时机进行补给,以保证旅程能够继续。
  2. 补给的优先级:从多个补给选项中,选择能让旅程覆盖最远距离的补给量。

解决思路

从问题描述来看,它具备明显的贪心特性:我们需要在每个关键点(当前位置无水前行时)做出最优决策,尽量选择当前能提供最多水量的补给站,以减少未来补给次数。具体的解决思路如下:

  1. 按距离排序补给站
    补给站的位置不一定是按顺序给出的,因此需要先将它们按距离从小到大排序。这样可以保证旅行者在沿途遇到补给站的顺序与实际前进顺序一致。
  2. 维护一个最大堆记录可选补给量
    在每经过一个补给站时,将其可提供的水量存入最大堆中。当发现当前携带的水量不足以到达下一个目的地时,从堆中取出最大值进行补给。这种策略确保了当前的补给选择是对后续行程最有利的。
  3. 处理终点作为特殊情况
    在所有补给站处理完后,还需要考虑终点的情况。如果当前水量仍不足以到达终点,则需要继续从最大堆中补给,否则任务失败。
  4. 计算补给次数
    每次从堆中取水,即为一次补给。通过计数器记录补给次数,最终返回结果。

贪心算法的优势

这一问题选择贪心算法有以下几个优势:

  1. 局部最优解的有效性
    在每次面临“是否需要补给”的选择时,选用当前能提供最大补给量的站点,总能为未来节省更多水量需求,减少补给次数。
  2. 时间效率高
    贪心算法主要依赖排序和堆操作,时间复杂度为 O(nlog⁡n),非常适合处理大规模输入。
  3. 简单易实现
    贪心算法直接针对问题的局部最优策略构建解决方案,逻辑清晰,代码量少。

实现步骤详解

具体的实现可以分为以下几个步骤:

  1. 输入数据的预处理
    将补给站信息存储为一个二维数组,并按照距离进行排序。

  2. 使用最大堆记录补给量
    遍历每个补给站时,将其补给量加入最大堆。在水量不足时,从堆中提取最大补给量。

  3. 终点检查
    当所有补给站处理完后,仍需检查剩余水量是否能覆盖到终点。如果无法到达,则返回 -1。

  4. 补给次数统计
    每次补充水量,计数器加一,最后输出最少补给次数。

java">import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;public class travel_lvzhou {public static int solution(int d, int w, int[] position, int[] supply) {int n = position.length;// 补给站按距离排序int[][] stations = new int[n][2];for (int i = 0; i < n; i++) {stations[i][0] = position[i];stations[i][1] = supply[i];}Arrays.sort(stations, Comparator.comparingInt(a -> a[0]));// 最大堆存储可以选择的补给量PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);int currentWater = w; // 当前水量int refills = 0; // 补给次数int prevPosition = 0; // 上一个位置for (int i = 0; i <= n; i++) {// 当前目标点,补给站或终点int currentPosition = (i < n) ? stations[i][0] : d;int distance = currentPosition - prevPosition;// 如果当前水量不足以到达下一个站点,进行补给while (currentWater < distance) {if (maxHeap.isEmpty()) {return -1; // 无法到达}currentWater += maxHeap.poll(); // 从最大堆中取最大水量refills++;}currentWater -= distance;prevPosition = currentPosition;// 如果是补给站,将其水量加入堆中if (i < n) {maxHeap.offer(stations[i][1]);}}return refills;}public static void main(String[] args) {// You can add more test cases hereint[] testPosition = {170, 192, 196, 234, 261, 269, 291, 404, 1055, 1121, 1150, 1234, 1268, 1402, 1725, 1726, 1727, 1762, 1901, 1970};int[] testSupply = {443, 185, 363, 392, 409, 358, 297, 70, 189, 106, 380, 130, 126, 411, 63, 186, 36, 347, 339, 50};System.out.println(solution(10, 4, new int[]{1, 4, 7}, new int[]{6, 3, 5}) == 1);System.out.println(solution(2000, 200, testPosition, testSupply) == 5);}}

外链:绿洲之旅:最少次数补给探索


http://www.ppmy.cn/news/1549495.html

相关文章

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

uiautomator案例

test下新建类 public class ButtonClickTest {private UiDevice device;Beforepublic void setUp() {// 初始化 UiDevice 实例device UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());try {device.executeShellCommand("am start -n com.yy.test/.…

JAVA部署到生产环境(服务器 全)

将Java应用部署到生产环境是一个复杂且需要细心规划的过程&#xff0c;主要包括代码准备、构建、测试、部署和监控等步骤。以下是一个完整的流程&#xff1a; 1. 准备阶段 1.1 确认需求与目标 确认生产环境的部署目标&#xff0c;例如性能要求、可用性、容灾能力等。制定部署…

leetcode刷题记录(四十二)——101. 对称二叉树

&#xff08;一&#xff09;问题描述 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/symmetric-tree/description/给你…

二进制 分析工具:Radare2、r2frida、Binutils、file、string、as、nm、ldd、objdump、readelf、strip

1、二进制 分析工具 工欲善其事&#xff0c;必先利其器&#xff0c;在二进制安全的学习中&#xff0c;​使用工具尤为重要。遇到一个不熟悉的文件时&#xff0c; 首先要确定 "这是什么类型的文件"&#xff0c;回答这个问题的首要原则是&#xff0c;绝不要根据文件的扩…

【青牛科技】 GC1288:散热风扇领域中 LA6588 / 三洋的理想替代者

在散热风扇的驱动芯片领域&#xff0c;芯麦 GC1288 以其独特的优势脱颖而出&#xff0c;成为替代 LA6588 / 三洋芯片的优质之选。它为散热风扇带来了更卓越的性能和更可靠的运行保障&#xff0c;在行业内引起了广泛关注。 一、GC1288 的特点 &#xff08;一&#xff09;优秀的…

FakeLocation Linux | Windows关于使用教程一些规范说明

前言:使用教程&#xff08;FakeLocation版本请使用1.2.xxx&#xff09;| (1.3.xxx 未测试) 环境模块&#xff0c;是指代FakeLocation开启以后会把环境弄的异常,环境模块可以保证环境安全Dia 作为软件需要在Lsp框架里面勾选激活使用&#xff0c;并且开启增强模式FakeLocation 请…

02. Python基础知识

一、注释 在开发程序过程中&#xff0c;如果一段代码的逻辑比较复杂&#xff0c;不是特别容易理解&#xff0c;可以适当添加注释&#xff0c;以辅助自己或其他开发人员解读代码。注释是给程序员看的&#xff0c;为了让程序员方便阅读代码&#xff0c;解释器会忽略注释。在 Pyto…