返回介绍

solution / 2100-2199 / 2187.Minimum Time to Complete Trips / README

发布于 2024-06-17 01:03:09 字数 3335 浏览 0 评论 0 收藏 0

2187. 完成旅途的最少时间

English Version

题目描述

给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。

每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运行,也就是说可以同时有多辆公交车在运行且互不影响。

给你一个整数 totalTrips ,表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间。

 

示例 1:

输入:time = [1,2,3], totalTrips = 5
输出:3
解释:
- 时刻 t = 1 ,每辆公交车完成的旅途数分别为 [1,0,0] 。
  已完成的总旅途数为 1 + 0 + 0 = 1 。
- 时刻 t = 2 ,每辆公交车完成的旅途数分别为 [2,1,0] 。
  已完成的总旅途数为 2 + 1 + 0 = 3 。
- 时刻 t = 3 ,每辆公交车完成的旅途数分别为 [3,1,1] 。
  已完成的总旅途数为 3 + 1 + 1 = 5 。
所以总共完成至少 5 趟旅途的最少时间为 3 。

示例 2:

输入:time = [2], totalTrips = 1
输出:2
解释:
只有一辆公交车,它将在时刻 t = 2 完成第一趟旅途。
所以完成 1 趟旅途的最少时间为 2 。

 

提示:

  • 1 <= time.length <= 105
  • 1 <= time[i], totalTrips <= 107

解法

方法一

class Solution:
  def minimumTime(self, time: List[int], totalTrips: int) -> int:
    mx = min(time) * totalTrips
    return bisect_left(
      range(mx), totalTrips, key=lambda x: sum(x // v for v in time)
    )
class Solution {
  public long minimumTime(int[] time, int totalTrips) {
    int mi = time[0];
    for (int v : time) {
      mi = Math.min(mi, v);
    }
    long left = 1, right = (long) mi * totalTrips;
    while (left < right) {
      long cnt = 0;
      long mid = (left + right) >> 1;
      for (int v : time) {
        cnt += mid / v;
      }
      if (cnt >= totalTrips) {
        right = mid;
      } else {
        left = mid + 1;
      }
    }
    return left;
  }
}
class Solution {
public:
  long long minimumTime(vector<int>& time, int totalTrips) {
    int mi = *min_element(time.begin(), time.end());
    long long left = 1, right = (long long) mi * totalTrips;
    while (left < right) {
      long long cnt = 0;
      long long mid = (left + right) >> 1;
      for (int v : time) cnt += mid / v;
      if (cnt >= totalTrips)
        right = mid;
      else
        left = mid + 1;
    }
    return left;
  }
};
func minimumTime(time []int, totalTrips int) int64 {
  left, right := 1, slices.Min(time)*totalTrips
  for left < right {
    mid := (left + right) >> 1
    cnt := 0
    for _, v := range time {
      cnt += mid / v
    }
    if cnt >= totalTrips {
      right = mid
    } else {
      left = mid + 1
    }
  }
  return int64(left)
}

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

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

发布评论

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