1014. Capacity To Ship Packages Within D Days 运输最小容量

1014. Capacity To Ship Packages Within D Days 运输最小容量

每天只能按顺序运送重 weight[i] 的物资,运输D天,求传送带的最小承重量 最小承重量为最重的那一个物资 最大承重量为所有物资的和,因为 D 至少可以为 1

这里有一个连续的搜索范围,妙用二分搜索来大幅降低搜索域,取容量为平均数,如果运送的天数大于 D,说明容量小了,如果小于D,说明容量大了

int shipWithinDays(vector<int>& weights, int D) {
    int max=weights[0];
    int sum=0;
    for(auto n : weights) {
        if (n>max) max=n;
        sum+=n;
    }

    int start=max;
    int end=sum;
    while(start<end) {
        int mid=(start+end)>>1;
        int ds=ship(weights, mid, D);
        if (ds > 0) start=mid+1;
        else end=mid;
    }
    return start;
}

int ship(vector<int> &w, int cap, int d, int cur=0, int curd=1) {
    for(auto n : w) {
        cur+=n;
        if (cur>cap) {
            cur=n;
            ++curd;
			// 大于D,提前结束
            if (curd>d) return 1;
        }
    }
    return curd-d;
}

#二分