首页 > 其他 > 详细

LC 1723. Find Minimum Time to Finish All Jobs (dp+二分)

时间:2021-01-11 20:52:00      阅读:41      评论:0      收藏:0      [点我收藏+]

link
技术分享图片

class Solution {
public:
    int n;
    int minimumTimeRequired(vector<int>& jobs, int k) {
        n=jobs.size();
        vector<int> sum(1<<n);
        for(int i=1;i<(1<<n);i++){
            for(int j=0;j<n;j++){
                if(i&(1<<j)){
                    sum[i]=sum[i-(1<<j)]+jobs[j];
                    break;
                }
            }
        }
        int left=0;
        int right=0;
        for(int i:jobs){
            left=max(left,i);
            right+=i;
        }
        while(left<=right){
            int mid=left+(right-left)/2;
            int workers=helper(mid,sum);
            if(workers<=k) right=mid-1;
            else left=mid+1;
        }
        return left;
    }

    int helper(int limit, vector<int>& sum){
        vector<int> dp(1<<n,INT_MAX);
        dp[0]=0;
        for(int i=1;i<(1<<n);i++){
            for(int j=i;j>0;j= ((j-1)&i)){
                if(sum[j]<=limit) dp[i]=min(dp[i],1+dp[i-j]);
            }
        }
        return dp[(1<<n)-1];
    }
};

LC 1723. Find Minimum Time to Finish All Jobs (dp+二分)

原文:https://www.cnblogs.com/FEIIEF/p/14263704.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!