2021-04-17:給定一個整型數組 arr,數組中的每一個值都爲正數,表示完成一幅畫做須要的時間,再 給定 一個整數 num,表示畫匠的數量,每一個畫匠只能畫連在一塊兒的畫做。全部的畫家 並行工做,請 返回完成全部的畫做須要的最少時間。【舉例】arr=[3,1,4],num=2。最好的分配方式爲第一個畫匠畫 3 和 1,所需時間爲 4。第二個畫匠畫 4,所需時間 爲 4。 由於並行工做,因此最少時間爲 4。若是分配方式爲第一個畫匠畫 3,所需時 間爲 3。第二個畫 匠畫 1 和 4,所需的時間爲 5。那麼最少時間爲 5,顯然沒有第一 種分配方式好。因此返回 4。arr=[1,1,1,4,3],num=3。最好的分配方式爲第一個畫匠畫前三個 1,所需時間爲 3。第二個畫匠畫 4,所需時間 爲 4。 第三個畫匠畫 3,所需時間爲 3。返回 4。java
福大大 答案2021-04-17:git
二分法。github
代碼用golang編寫。代碼以下:golang
package main import ( "fmt" "math" ) func main() { arr := []int{ 2, 6, 3, 5} M := 2 ret := splitArray3(arr, M) fmt.Println(ret) } func splitArray3(nums []int, M int) int { sum := int64(0) for i := 0; i < len(nums); i++ { sum += int64(nums[i]) } l := int64(0) r := int64(sum) ans := int64(0) for l <= r { mid := int64((l + r) / 2) cur := getNeedParts(nums, mid) if cur <= M { ans = mid r = mid - 1 } else { l = mid + 1 } } return int(ans) } func getNeedParts(arr []int, aim int64) int { for i := 0; i < len(arr); i++ { if int64(arr[i]) > aim { return math.MaxInt32 } } parts := 1 all := arr[0] for i := 1; i < len(arr); i++ { if int64(all+arr[i]) > aim { parts++ all = arr[i] } else { all += arr[i] } } return parts }
執行結果以下:
數組