日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/11/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給你一個(gè)整數(shù)數(shù)組 jobs ,其中 jobs[i] 是完成第 i 項(xiàng)工作要花費(fèi)的時(shí)間。

請(qǐng)你將這些工作分配給 k 位工人。所有工作都應(yīng)該分配給工人,且每項(xiàng)工作只能分配給一位工人。工人的 工作時(shí)間 是完成分配給他們的所有工作花費(fèi)時(shí)間的總和。請(qǐng)你設(shè)計(jì)一套最佳的工作分配方案,使工人的 最大工作時(shí)間 得以 最小化 。

返回分配方案中盡可能 最小 的 最大工作時(shí)間 。

示例 1:

輸入:jobs = [3,2,3], k = 3
輸出:3
解釋:給每位工人分配一項(xiàng)工作,最大工作時(shí)間是 3 。
示例 2:

輸入:jobs = [1,2,4,7,8], k = 2
輸出:11
解釋:按下述方式分配工作:
1 號(hào)工人:1、2、8(工作時(shí)間 = 1 + 2 + 8 = 11)
2 號(hào)工人:4、7(工作時(shí)間 = 4 + 7 = 11)
最大工作時(shí)間是 11 。

解題思路

1. 二分

對(duì)于最小 的 最大工作時(shí)間進(jìn)行二分搜索,同時(shí)限定搜索的區(qū)間[時(shí)間最長的工作,所有工作的總時(shí)間],右邊界為所有工作的總時(shí)間(一個(gè)人干完所有的活),時(shí)間最長的工作(即使在最好的情況下,也要花費(fèi)這個(gè)工作的時(shí)間)

因?yàn)間olang的sort.Search函數(shù)搜索的區(qū)間是[0,n),因此需要修改二分的代碼

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

2. 剪枝

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

兩種情況需要剪枝
在將cur號(hào)工作分配給i號(hào)工人時(shí),遞歸下去無法找到滿足條件的解情況下(即bc(cur+1)為false的情況,如果是true就直接return了)

  • 當(dāng)前的工人要完成這個(gè)工作的話,剛剛等于限定的工作時(shí)間

  • 當(dāng)前工人沒被分配工作(load[i]==0)
    當(dāng)前的工人即使分配了工作的情況下,都不能滿足條件了。如果load[i]==0,就是這次不干活了,活就要給其他人干,需要的時(shí)間就更長了,那就更不可能完成任務(wù)了

  • 3. 回溯

    從大到小遞歸遍歷每一項(xiàng)工作時(shí)間,在一次遞歸中嘗試將當(dāng)前工作分配給每個(gè)工人,維護(hù)一個(gè)保存工人工作時(shí)間的數(shù)組,然后開啟層遞歸下一個(gè)工作,如果不滿足條件則回溯數(shù)組,直到工作都分配完。

    代碼

    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)}) }

    總結(jié)

    以上是生活随笔為你收集整理的leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。