LeetCode LCP 12. 小张刷题计划 (最小化最大值、二分)

LCP 12. 小张刷题计划
最小化最大值问题的基本问题模型。
如果说答案是 T 0 T_0 T0,那么他一定可以在 T 0 + 1 、 T 0 + 2 、 … … T_0+1、T_0+2、…… T0+1T0+2完成这个任务。
反之,如果不行,那么他在 T 0 − 1 、 T 0 − 2 、 … … T_0-1、T_0-2、…… T01T02也都不可能完成。
而这就满足了二分的两段性。
具体判断时,要判断一个子区间如果去除掉其中的最大值之后能否小于一个阈值,如果超过,就花费了一天。

class Solution {
    
    
public:
    int m;
    int minTime(vector<int>& time, int m) {
    
    
        this->m = m;
        int l = 0, r = 1e9;
        while(l<r){
    
    
            int mid = l+(r-l)/2;
            if(ok(mid,time)){
    
    
                r = mid;
            }else{
    
    
                l = mid+1;
            }
        }
        return l;
    }
    bool ok(int top,const vector<int> time){
    
    
        int days = 0, mmax = 0, sum = 0;
        for(int i=0;i<time.size();i++){
    
    
            sum += time[i];
            mmax = max(mmax,time[i]);
            if(sum-mmax>top){
    
    
                days++;
                sum = 0;
                mmax = 0;
                i--;
            }
        }
        if(sum>0) days++;
        return days<= m;
    }   
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108425498