ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-03-04:一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管

2021-03-04 22:55:30  阅读:172  来源: 互联网

标签:03 20 花费 30 60 金条 长度


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铜板。输入一个数组,返回分割的最小代价。

福哥答案2021-03-04:

小根堆。
1.数组全部放入小根堆。
2.pop两个数并且相加,和为S。
3.结果里加上S。
4.把S放进小根堆里。
5.重复步骤2。直到数组的长度为1,停止循环。
有代码。

代码用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代码
评论

标签:03,20,花费,30,60,金条,长度
来源: https://blog.51cto.com/14891145/2647416

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有