leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)
给你一个整数数组 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了)
当前的工人要完成这个工作的话,刚刚等于限定的工作时间
当前工人没被分配工作(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. 完成所有工作的最短时间(二分+剪枝+回溯)相关推荐
- leetcode 1723.完成所有工作的最短时间 - 二分+递归
leetcode 1723.完成所有工作的最短时间 - 二分+递归 题干 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有 ...
- LeetCode 1723 完成所有工作的最短时间 题解
LeetCode 1723 完成所有工作的最短时间 题解 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给 ...
- (leetcode)1723. 完成所有工作的最短时间 -2021/5/8
文章目录 1723. 完成所有工作的最短时间 javascript 1723. 完成所有工作的最短时间 javascript 题目: 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i ...
- LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...
- 力扣 1723. 完成所有工作的最短时间 二分+回溯+剪枝/状压dp
https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/ 思路一:显然最大工作时间满足单调性,所以可以用二分来写.但 ...
- 1723. 完成所有工作的最短时间
原题链接:1723. 完成所有工作的最短时间 solution: dfs + 回溯 + 剪枝 ①结束条件:任务分配完成,maxt保存所有工人的最大工作时长,再用maxt和以前的最大工作 ...
- 【LeetCode每日一题】1723. 完成所有工作的最短时间
[LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...
- [leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间
1723. 完成所有工作的最短时间 题目 思路 动态规划 状态转移方程 优化 求和打表 快速枚举每种选取情况jjj的子集ppp 代码 算法复杂度 题目来源于leetcode,解法和思路仅代表个人观点. ...
- LeetCode每日一题: 1723. 完成所有工作的最短时间
1723. 完成所有工作的最短时间 题目 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给工人,且每项工作 ...
最新文章
- PM2管理node.js
- ACCP学习旅程之----- 使用HTML语言开发商业站点(第一章 HTML的基本标签)
- Bootstrap模态框报错
- Golang中的自动伸缩和自防御设计
- python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
- Spark创建DataFrame的三种方法
- spark广播变量的使用(转)
- ★LeetCode(538)——把二叉搜索树转换为累加树(JavaScript)
- 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
- Vim 可视化模式入门
- mysql特效_Cocos2d-x学习笔记(16)(常见22种特效)
- hadoop中MapReduce多种join实现实例分析
- 综合布线(楼栋)需求分析报告
- 架构之美第八章-软件架构的含义
- 国民体质测定标准计算机应用软件,体测标准计算器
- 网页效果图设计之色彩配色索引
- 【数据库】一篇文章搞掂:Oracle数据库
- 如何快速的下载百度网盘的文件
- IoT企业物联网平台,从设备端到云端业务系统全链路开发实战——实践类
- Android编程红外编程——红外码详析