这是道中等题,如果一下子就想到的还是很快的(20min内完成)。我一开始用dp,结果RE了,调了半天,最后一看思路就不对。
总之就是如果某道没见过的题,第一反应是回溯,思考能不能用dp; 如果想到的是dp,尤其是要用好几维的,就想想其他方法。dp本质是暴力,空间也大,实在不行再dp
本题关键词:二分搜索,贪心
首先,货物是连续装运,那么要天数最少,肯定是装到装不下为止再发送出去。
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;
}
};