1011. 在 D 天内送达包裹的能力 C语言

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。

解题思路:

该题的标签是二分查找,所以是找到二分的突破口。

二分法关键是找出起始上标和下标,毋庸置疑上标是0,这题就需要多思考下标是多少。

由于不能明确从题中找出,所以只有采用取最大值的思路,即整形最大值INT_MAX

cando函数 是用来判断K为最大承载量时能否完成任务

bool cando(int* weights, int K, int D,int n)
{
    int tmp = K;
    for(int i = 0; i < n; i++){
        if(weights[i] > K)return false;
        if(tmp < weights[i]){
            tmp = K - weights[i];          
            if(--D < 0)return false;
            continue;
        }
        tmp -= weights[i];
    }
    return D > 0;
}

int shipWithinDays(int* weights, int weightsSize, int D){
    int l = 0;
    int h = INT_MAX;
    while(l < h){
        int mid = l + (h - l) / 2;
        if(cando(weights, mid, D,weightsSize)){
            h = mid;
        }
        else{
            l = mid + 1;
        }
    }

return l;
}

 

你可能感兴趣的:(c++学习)