返回介绍

lcp / LCP 72. 补给马车 / README

发布于 2024-06-17 01:04:41 字数 4520 浏览 0 评论 0 收藏 0

LCP 72. 补给马车

题目描述

远征队即将开启未知的冒险之旅,不过在此之前,将对补给车队进行最后的检查。supplies[i] 表示编号为 i 的补给马车装载的物资数量。 考虑到车队过长容易被野兽偷袭,他们决定将车队的长度变为原来的一半(向下取整),计划为:

  • 找出车队中 物资之和最小 两辆 相邻 马车,将它们车辆的物资整合为一辆。若存在多组物资之和相同的马车,则取编号最小的两辆马车进行整合;
  • 重复上述操作直到车队长度符合要求。

请返回车队长度符合要求后,物资的分布情况。

示例 1:

输入:supplies = [7,3,6,1,8]

输出:[10,15]

解释: 第 1 次合并,符合条件的两辆马车为 6,1,合并后的车队为 [7,3,7,8]; 第 2 次合并,符合条件的两辆马车为 (7,3) 和 (3,7),取编号最小的 (7,3),合并后的车队为 [10,7,8]; 第 3 次合并,符合条件的两辆马车为 7,8,合并后的车队为 [10,15]; 返回 [10,15]

示例 2:

输入:supplies = [1,3,1,5]

输出:[5,5]

解释:

  • 2 <= supplies.length <= 1000
  • 1 <= supplies[i] <= 1000

解法

方法一:模拟

根据题目描述,我们每次遍历 supplies,找到物资之和最小的两辆相邻马车,将它们车辆的物资整合为一辆,重复上述操作直到车队长度符合要求。

时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为 supplies 的长度。

class Solution:
  def supplyWagon(self, supplies: List[int]) -> List[int]:
    for _ in range((len(supplies) + 1) >> 1):
      n = len(supplies)
      mi = inf
      k = 0
      for i in range(n - 1):
        x = supplies[i] + supplies[i + 1]
        if mi > x:
          mi = x
          k = i
      t = []
      i = 0
      while i < n:
        if i == k:
          t.append(mi)
          i += 2
        else:
          t.append(supplies[i])
          i += 1
      supplies = t
    return supplies
class Solution {
  public int[] supplyWagon(int[] supplies) {
    for (int h = (supplies.length + 1) >> 1; h > 0; --h) {
      int n = supplies.length;
      int mi = 1 << 30;
      int k = 0;
      for (int i = 0; i < n - 1; ++i) {
        int x = supplies[i] + supplies[i + 1];
        if (mi > x) {
          mi = x;
          k = i;
        }
      }
      int[] t = new int[n - 1];
      for (int i = 0, j = 0; i < n; ++i, ++j) {
        if (i == k) {
          t[j] = mi;
          ++i;
        } else {
          t[j] = supplies[i];
        }
      }
      supplies = t;
    }
    return supplies;
  }
}
class Solution {
public:
  vector<int> supplyWagon(vector<int>& supplies) {
    for (int h = (supplies.size() + 1) >> 1; h; --h) {
      int n = supplies.size();
      int mi = 1 << 30;
      int k = 0;
      for (int i = 0; i < n - 1; ++i) {
        int x = supplies[i] + supplies[i + 1];
        if (mi > x) {
          mi = x;
          k = i;
        }
      }
      vector<int> t(n - 1);
      for (int i = 0, j = 0; i < n; ++i, ++j) {
        if (i == k) {
          t[j] = mi;
          ++i;
        } else {
          t[j] = supplies[i];
        }
      }
      supplies = move(t);
    }
    return supplies;
  }
};
func supplyWagon(supplies []int) []int {
  for h := (len(supplies) + 1) >> 1; h > 0; h-- {
    n := len(supplies)
    mi := 1 << 30
    k := 0
    for i := 0; i < n-1; i++ {
      x := supplies[i] + supplies[i+1]
      if mi > x {
        mi = x
        k = i
      }
    }
    t := make([]int, n-1)
    for i, j := 0, 0; i < n; i, j = i+1, j+1 {
      if i == k {
        t[j] = mi
        i++
      } else {
        t[j] = supplies[i]
      }
    }
    supplies = t
  }
  return supplies
}
function supplyWagon(supplies: number[]): number[] {
  for (let h = (supplies.length + 1) >> 1; h > 0; --h) {
    const n = supplies.length;
    let mi = 1 << 30;
    let k = 0;
    for (let i = 0; i < n - 1; ++i) {
      const x = supplies[i] + supplies[i + 1];
      if (mi > x) {
        mi = x;
        k = i;
      }
    }
    const t: number[] = new Array(n - 1);
    for (let i = 0, j = 0; i < n; ++i, ++j) {
      if (i === k) {
        t[j] = mi;
        ++i;
      } else {
        t[j] = supplies[i];
      }
    }
    supplies = t;
  }
  return supplies;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文