• 丛林探险问题


    一 问题描述

    一群人开着一辆卡车冒险进入丛林深处,卡车油箱坏了,每走 1 米就会漏 1 升油,他们需要到最近的城镇修理卡车。卡车当前位置和城镇之间有 N 个加油站,每个加油站都可以加油 1 到 100 升。卡车油箱容量没有限制,目前卡车距离城镇 L 米,有 P 升油。他们希望在前往城镇的路上尽可能少地停下加油,请给出到达城镇所需的最少加油次数。

    二 输入和输出

    1 输入

    第 1 行包含单个整数N,表示加油站的数量。第 2 到 N+1 行,每行都包含两个整数,用于描述加油站,第一个整数是从城镇到加油站的距离,第二个整数是该加油站的可用油量。第 N+2 行,每行都包含两个整数 L 和 P。

    2 输出

    输出到达城镇所需的最少加油次数,若无法到达城镇,则输出-1。

    三 输入和输出样例

    1 输入样例

    4

    4 4

    5 2

    11 5

    15 10

    25 10

    2 输出样例

    2

    四 分析和设计

    若在可以到达的距离范围内有多个加油站,则将这些站点的加油量入队(优先队列),若走到下一个加油站之前油会耗尽,则需要加油(优先队列中最大加油量)后继续走。当油量大于或等于卡车到城镇的距离 L 时 结束。

    五 图解

    在输入样例中,卡车距离城镇 25 米,有 10 升油。沿着这条路,距离城镇 4、5、11 和 15 米有 4 个加油站(可求出这些加油站距离卡车 21、20、14、10 米),这些加油站可分别提供多达 4、2、5、10 升的油。

    求解的过程:因为卡车有 10 升油,所以首先开车 10 米,在第 1 个加油站加油 10 升,在第 2 个加油站加油 5 升,油箱的油量累计可到达距离 25,可直接开车到镇上。答案:停靠 2 次。

    六 算法设计

    1 按照距离降序排序。

    2 初始化。加油次数 ans =0,当前可到达的位置 pos=P,第 k 个站点 k=0。

    3 若 pos < L,则执行第 4 步;否则结束,输出答案。

    4 若可到达的位置超过第 k 个加油站,则将第 k 个站点的加油量入队(最大值优先),k++,一直循环到不满足条件为止。

    5 若队列为空,则输出 -1,否则加油(pos+=que.top();que.pop;ans++),转向第 3 步。

    七 代码

    1. package com.platform.modules.alg.alglib.poj2431;
    2. import java.util.Arrays;
    3. import java.util.Comparator;
    4. import java.util.PriorityQueue;
    5. public class Poj2431 {
    6. class MyComparator implements Comparator {
    7. public int compare(Integer num1, Integer num2) {
    8. return num2.compareTo(num1);
    9. }
    10. }
    11. public String output = "";
    12. private final int N = 10005;
    13. int n, L, P;
    14. private node port[] = new node[N];
    15. public Poj2431() {
    16. for (int i = 0; i < port.length; i++) {
    17. port[i] = new node();
    18. }
    19. }
    20. void solve() {
    21. PriorityQueue que = new PriorityQueue<>(new MyComparator());
    22. // ans:加油次数 pos:当前可到达的位置 k:第 k 个加油站
    23. int ans = 0, pos = P, k = 0;
    24. while (pos < L) {
    25. while (pos >= L - port[k].dis && k < n) {
    26. que.add(port[k].add);
    27. k++;
    28. }
    29. if (que.isEmpty()) {
    30. output = "-1";
    31. return;
    32. } else {
    33. pos += que.poll();
    34. ans++;
    35. }
    36. }
    37. output = "" + ans;
    38. }
    39. public String cal(String input) {
    40. String[] line = input.split("\n");
    41. n = Integer.parseInt(line[0]);
    42. for (int i = 1; i <= n; i++) {
    43. String[] nums = line[i].split(" ");
    44. port[i].dis = Integer.parseInt(nums[0]);
    45. port[i].add = Integer.parseInt(nums[1]);
    46. }
    47. String[] num = line[n + 1].split(" ");
    48. L = Integer.parseInt(num[0]);
    49. P = Integer.parseInt(num[1]);
    50. Arrays.sort(port);
    51. solve();
    52. return output;
    53. }
    54. }
    55. class node implements Comparable {
    56. public int dis; // 距离
    57. public int add; // 可加油量
    58. // 按距离降序
    59. @Override
    60. public int compareTo(java.lang.Object o) {
    61. return this.dis > ((node) o).dis ? -1 : 1;
    62. }
    63. }

    八 测试

  • 相关阅读:
    微信小程序--下拉选择框组件封装,可CV直接使用
    面试问题之如何解释微服务
    将scut-seg标签转化成通用coco标签
    一些SQL的基本概念和用法
    Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性
    【pytorch记录】pytorch的分布式 torch.distributed.launch 命令在做什么呢
    排序算法之详解选择排序
    我的Go+语言初体验——祝福留言小系统,让她也可以感受到你的祝福
    基于Vue+nodejs+Element-ui的聊天框项目
    Ubuntu整系统迁移到另一个硬盘中
  • 原文地址:https://blog.csdn.net/chengqiuming/article/details/126568666