给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。

请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。

返回分配方案中尽可能 最小 的 最大工作时间 。

示例 1:

输入:jobs = [3,2,3], k = 3
输出:3
解释:给每位工人分配一项工作,最大工作时间是 3 。
示例 2:

输入:jobs = [1,2,4,7,8], k = 2
输出:11
解释:按下述方式分配工作:
1 号工人:1、2、8(工作时间 = 1 + 2 + 8 = 11)
2 号工人:4、7(工作时间 = 4 + 7 = 11)
最大工作时间是 11 。

解题思路

1. 二分

对于最小 的 最大工作时间进行二分搜索,同时限定搜索的区间[时间最长的工作,所有工作的总时间],右边界为所有工作的总时间(一个人干完所有的活),时间最长的工作(即使在最好的情况下,也要花费这个工作的时间)

因为golang的sort.Search函数搜索的区间是[0,n),因此需要修改二分的代码

 l+ sort.Search(r-l, func(limit int) bool {limit+=l

2. 剪枝

             if lo+jobs[cur]==limit || load[i]==0{break}

两种情况需要剪枝
在将cur号工作分配给i号工人时,递归下去无法找到满足条件的解情况下(即bc(cur+1)为false的情况,如果是true就直接return了)

  1. 当前的工人要完成这个工作的话,刚刚等于限定的工作时间

  2. 当前工人没被分配工作(load[i]==0)
    当前的工人即使分配了工作的情况下,都不能满足条件了。如果load[i]==0,就是这次不干活了,活就要给其他人干,需要的时间就更长了,那就更不可能完成任务了

3. 回溯

从大到小递归遍历每一项工作时间,在一次递归中尝试将当前工作分配给每个工人,维护一个保存工人工作时间的数组,然后开启层递归下一个工作,如果不满足条件则回溯数组,直到工作都分配完。

代码

func minimumTimeRequired(jobs []int, k int) int {sort.Sort(sort.Reverse(sort.IntSlice(jobs)))l,r:=jobs[0],0for _, job := range jobs {r+=job}return l+ sort.Search(r-l, func(limit int) bool {limit+=lload := make([]int, k)var bc func(cur int) boolbc = func(cur int) bool{if cur==len(jobs){return true}for i, lo := range load {if lo+jobs[cur]<=limit{load[i]+=jobs[cur]if bc(cur+1){return true}load[i]-=jobs[cur]}if lo+jobs[cur]==limit || load[i]==0{break}}return false}return bc(0)})
}

leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)相关推荐

  1. leetcode 1723.完成所有工作的最短时间 - 二分+递归

    leetcode 1723.完成所有工作的最短时间 - 二分+递归 题干 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有 ...

  2. LeetCode 1723 完成所有工作的最短时间 题解

    LeetCode 1723 完成所有工作的最短时间 题解 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给 ...

  3. (leetcode)1723. 完成所有工作的最短时间 -2021/5/8

    文章目录 1723. 完成所有工作的最短时间 javascript 1723. 完成所有工作的最短时间 javascript 题目: 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i ...

  4. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

  5. 力扣 1723. 完成所有工作的最短时间 二分+回溯+剪枝/状压dp

    https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/ 思路一:显然最大工作时间满足单调性,所以可以用二分来写.但 ...

  6. 1723. 完成所有工作的最短时间

    原题链接:1723. 完成所有工作的最短时间 solution:         dfs + 回溯 + 剪枝 ①结束条件:任务分配完成,maxt保存所有工人的最大工作时长,再用maxt和以前的最大工作 ...

  7. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  8. [leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间

    1723. 完成所有工作的最短时间 题目 思路 动态规划 状态转移方程 优化 求和打表 快速枚举每种选取情况jjj的子集ppp 代码 算法复杂度 题目来源于leetcode,解法和思路仅代表个人观点. ...

  9. LeetCode每日一题: 1723. 完成所有工作的最短时间

    1723. 完成所有工作的最短时间 题目 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给工人,且每项工作 ...

最新文章

  1. PM2管理node.js
  2. ACCP学习旅程之----- 使用HTML语言开发商业站点(第一章 HTML的基本标签)
  3. Bootstrap模态框报错
  4. Golang中的自动伸缩和自防御设计
  5. python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
  6. Spark创建DataFrame的三种方法
  7. spark广播变量的使用(转)
  8. ★LeetCode(538)——把二叉搜索树转换为累加树(JavaScript)
  9. 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
  10. Vim 可视化模式入门
  11. mysql特效_Cocos2d-x学习笔记(16)(常见22种特效)
  12. hadoop中MapReduce多种join实现实例分析
  13. 综合布线(楼栋)需求分析报告
  14. 架构之美第八章-软件架构的含义
  15. 国民体质测定标准计算机应用软件,体测标准计算器
  16. 网页效果图设计之色彩配色索引
  17. 【数据库】一篇文章搞掂:Oracle数据库
  18. 如何快速的下载百度网盘的文件
  19. IoT企业物联网平台,从设备端到云端业务系统全链路开发实战——实践类
  20. Android编程红外编程——红外码详析

热门文章

  1. 九大经典算法之冒泡排序、快速排序
  2. Bloom Filter算法
  3. 父、子页面之间页面元素的获取,方法的调用
  4. struts2中非表单标签的使用 componen
  5. android中的tabdemo
  6. MonoRail学习-介绍篇(一)
  7. DNS的几个基本概念:
  8. PE文件的感染C++源代码
  9. 多米诺骨牌v.1MEL语言
  10. webservice 启用代理服务器