• 1011. Capacity To Ship Packages Within D Days


    问题:

    传送带依次传送weights数组上对应元素重量的货物。

    限制每天最多传送X重量的货物,D天刚好传送完毕,请问这个限重X是多少。

    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 <= D <= weights.length <= 50000
    1 <= weights[i] <= 500
    

    解法:

    二分查找:最合适的每日限重。

    这个限重的范围:

    最小值l:最小一天只运送一件货物,所有货物中的最大重量的那一件货物也能被运送。max(weights[i])

    最大值h:一天送完所有货物,所有货物总量之和。sum(weights[..])

    找最大最小值之间,最合适的限重,使得:

    每天都有货物可送,且连续送D天。

    尝试中,

    若送的days天数>D天,那么调整【扩大】每天最多送的量 l->mid+1

    若送的days天数<=D天,那么调整【缩小】每天最多送的量 h->mid

    代码参考:

     1 class Solution {
     2 public:
     3     int shipWithinDays(vector<int>& weights, int D) {
     4         int l=0, h=0;
     5         int n=weights.size();
     6         for(int w:weights){
     7             h+=w;
     8             l=max(l, w);
     9         }
    10         while(l<h){
    11             int mid=(l+h)/2;
    12             int cur=0, days=1;
    13             for(int w:weights){
    14                 if(cur+w > mid){
    15                     days++;
    16                     cur=0;
    17                 }
    18                 cur+=w;
    19             }
    20             if(days>D) l=mid+1;
    21             else h=mid;
    22         }
    23         return l;
    24     }
    25 };
  • 相关阅读:
    segmentation fault(core dumped)
    (LIS LCS 例题)Max Sum Advanced Fruits Super Jumping! Jumping! Jumping!
    几种数学公式(环排列 母函数 唯一分解定理 卡特兰数 默慈金数 贝尔数 那罗延数)
    map set 详解
    算法录 之 二分和三分
    LIS 最长上升子序列 LCS 最长公共子序列 模板
    JAVA 大数据 例题
    Java 实现大数算法
    7 21 第一次团队赛——————写给队友
    离散化+unique()+二分查找
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13030231.html
Copyright © 2020-2023  润新知