zoukankan      html  css  js  c++  java
  • 【leetcode】1014. Capacity To Ship Packages Within D Days

    题目如下:

    A conveyor belt has packages that must be shipped from one port to another within D days.

    The i-th package on the conveyor belt has a weight of weights[i].  Each day, we load the ship with packages on the conveyor belt (in the order given by weights). We may not load more weight than the maximum weight capacity of the ship.

    Return the least weight capacity of the ship that will result in all the packages on the conveyor belt being shipped within D days.

    Example 1:

    Input: weights = [1,2,3,4,5,6,7,8,9,10], D = 5
    Output: 15
    Explanation: 
    A ship capacity of 15 is the minimum to ship all the packages in 5 days like this:
    1st day: 1, 2, 3, 4, 5
    2nd day: 6, 7
    3rd day: 8
    4th day: 9
    5th day: 10
    
    Note that the cargo must be shipped in the order given, so using a ship of capacity 14 and splitting the packages into parts like (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) is not allowed. 
    

    Example 2:

    Input: weights = [3,2,2,4,1,4], D = 3
    Output: 6
    Explanation: 
    A ship capacity of 6 is the minimum to ship all the packages in 3 days like this:
    1st day: 3, 2
    2nd day: 2, 4
    3rd day: 1, 4
    

    Example 3:

    Input: weights = [1,2,3,1,1], D = 4
    Output: 3
    Explanation: 
    1st day: 1
    2nd day: 2
    3rd day: 3
    4th day: 1, 1
    

    Note:

    1. 1 <= D <= weights.length <= 50000
    2. 1 <= weights[i] <= 500

    解题思路:首先可以确认Capacity的最小值是1,最大值是50000*500。因为知道上下限,所以这里可以采用二分查找的方法。记w[i]为前i个包裹的重量和,显然w是一个递增的数组,假设Capacity为mid,那第一天可以装载的包裹的重量就是在w中最大的小于或者等于mid的元素,这里记为w[j],那第二天能装载的最大重量就是w[j] + mid,同理可以在w中最大的小于或者等于w[j]+mid的元素,因为w是有序的,所以这里继续使用二分查找,如果D天装载的包裹重量能大于或者等于w[-1],那么表示mid满足条件,下一步让 = mid - 1;如果不满足说明则令mid = low + 1,直到找出最小的mid为止。

    代码如下:

    class Solution(object):
        def shipWithinDays(self, weights, D):
            """
            :type weights: List[int]
            :type D: int
            :rtype: int
            """
            w = []
            low = 0
            for i in weights:
                low = max(low,i)
                if len(w) == 0:
                    w += [i]
                else:
                    w += [w[-1] + i]
            #print w
            high = 50000*500
            res = float('inf')
            import bisect
            while low <= high:
                mid = (low+high)/2
                start = 0
                times = 1
                tmp_weight = mid
                while times <= D:
                    inx = bisect.bisect_left(w,tmp_weight,start)
                    if inx == len(w):
                        break
                    elif tmp_weight == w[inx]:
                        if inx == len(w) - 1:
                            break
                        tmp_weight = w[inx] + mid
                        times += 1
                    else:
                        tmp_weight = w[inx-1] + mid
                        times += 1
                #print mid,times
                if times <= D and tmp_weight >= w[-1]:
                    res = min(res,mid)
                    high = mid -1
                else:
                    low = mid + 1
    
            return res
  • 相关阅读:
    rhel7 编写CMakeList.txt编译运行MySQL官方例子代码
    记录下 rhel 7 安装MySQL 并重置root密码
    杨辉三角 可以不用二维数组的
    一个ACE 架构的 Socket Client
    一个ACE 架构的 C++ Timer
    一个C++版的网络数据包解析策略
    标记下 'net 查壳/脱壳/加壳' 工具
    C++动态加载DLL调用方法
    C# (灰度)加权平均法将图片转换为灰度图
    C# GMap下提供一个高德地图
  • 原文地址:https://www.cnblogs.com/seyjs/p/10559878.html
Copyright © 2011-2022 走看看