每日一题DAY19在D天内送达包裹的能力

在D天内送达包裹的能力

这是道中等题,如果一下子就想到的还是很快的(20min内完成)。我一开始用dp,结果RE了,调了半天,最后一看思路就不对。
总之就是如果某道没见过的题,第一反应是回溯,思考能不能用dp; 如果想到的是dp,尤其是要用好几维的,就想想其他方法。dp本质是暴力,空间也大,实在不行再dp
本题关键词:二分搜索,贪心
每日一题DAY19在D天内送达包裹的能力
首先,货物是连续装运,那么要天数最少,肯定是装到装不下为止再发送出去。
x表示运载能力,如果x能运完,比x大的就更能运完;所以可以二分找x
二分的边界:至少是最轻的包裹;至多是全部的重量

class Solution {
    //载重为x所需要的运送天数是否满足条件
    bool nday(int x,vector<int>& weights,int D){
        int sum = 0,day = 1,i = 0;
        while(i < weights.size()){
            sum+=weights[i];
            if (sum > x){
                sum=0;
                ++day;
                if (day > D)
                    return false;
            }
            else
                ++i;
        }
        return true;
    }

public:
    int shipWithinDays(vector<int>& weights, int D) {
        int right = accumulate(weights.begin(),weights.end(),0);
        int left = *min_element(weights.begin(),weights.end());
        int res = right;
        
        while(left <= right){
            int mid = left + ((right - left)>>1);
            bool trans = nday(mid,weights,D);
            if (trans == true){
                res = mid;
                right = mid - 1;
            }
            else
                left = mid + 1;
        }
        
        return res;
    }
};
上一篇:微型编译器(AST语法树添加)


下一篇:《ICLR 2020论文分享-BERT在神经机器翻译中的应用》