2021-03-04:一塊金條切成兩半,是須要花費和長度數值同樣的銅板的。好比長度爲20的金條,無論

2021-03-04:一塊金條切成兩半,是須要花費和長度數值同樣的銅板的。好比長度爲20的金條,無論怎麼切,都要花費20個銅板。 一羣人想整分整塊金條,怎麼分最省銅板? 例如,給定數組{10,20,30},表明一共三我的,整塊金條長度爲60,金條要分紅10,20,30三個部分。若是先把長度60的金條分紅10和50,花費60; 再把長度50的金條分紅20和30,花費50;一共花費110銅板。但若是先把長度60的金條分紅30和30,花費60;再把長度30金條分紅10和20, 花費30;一共花費90銅板。輸入一個數組,返回分割的最小代價。 java

福哥答案2021-03-04:git

小根堆。
1.數組所有放入小根堆。
2.pop兩個數而且相加,和爲S。
3.結果里加上S。
4.把S放進小根堆裏。
5.重複步驟2。直到數組的長度爲1,中止循環。
有代碼。github

代碼用golang編寫,代碼以下:golang

package main

import (
    "container/heap"
    "fmt"
    "sort"
)

func main() {
    arr := []int{10, 30, 20}
    ret := lessMoney(arr)
    fmt.Println(ret)
}
func lessMoney(arr []int) int {
    arrLen := len(arr)
    if arrLen <= 1 {
        return 0
    }
    h := IntHeap(arr)
    heap.Init(&h)
    ans := 0
    twosum := 0
    for i := 1; i < arrLen; i++ {
        twosum = heap.Pop(&h).(int) + heap.Pop(&h).(int)
        ans += twosum
        heap.Push(&h, twosum)
    }
    return ans
}

//小根堆
type IntHeap sort.IntSlice

func (c IntHeap) Len() int           { return len(c) }
func (c IntHeap) Less(i, j int) bool { return c[i] < c[j] }
func (c IntHeap) Swap(i, j int)      { c[i], c[j] = c[j], c[i] }

func (c *IntHeap) Push(x interface{}) {
    *c = append(*c, x.(int))

}
func (c *IntHeap) Pop() interface{} {
    old := *c
    n := len(old)
    x := old[n-1]
    *c = old[0 : n-1]
    return x
}

執行結果以下:
在這裏插入圖片描述數組


左神java代碼
評論app

相關文章
相關標籤/搜索