C/C++教程

leetcode 1011. 在 D 天内送达包裹的能力

本文主要是介绍leetcode 1011. 在 D 天内送达包裹的能力,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

抽象为把序列分成D段,求和最大的段的最小值

下界为最大值,上界为序列和,二分结果,每次去验证是否合适即可

class Solution {
public:

    int shipWithinDays(vector<int>& weights, int D) {
        int total = 0;
        int max_v = weights[0];
        for(int i = 0; i < weights.size(); i++) max_v = max(max_v, weights[i]), total += weights[i];
        int x = max_v, y = total;
        int cnt = 1, cnt_s;
        while(x < y)
        {
            cnt_s = 0;
            cnt = 1;
            int mid = (x + y) / 2;
            int i;
            for(i = 0; i < weights.size(); i++)
                if(cnt_s + weights[i] <= mid) cnt_s += weights[i];
                else cnt_s = weights[i], cnt++; 
            if(cnt > D) x = mid + 1;
            else y = mid;
        }
        return x;


    }
};

 

这篇关于leetcode 1011. 在 D 天内送达包裹的能力的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!