2018 阿里编程测验题目 求大神给思路!

过年的时候地主给长工发工钱,地主打算切开一根金条,按照长工的工作量每人分一部分。只有金匠才能切开金条,每切一次,金匠要收金条长度个铜币,比如长度为15的金条切开一次要收15个铜币。地主希望找到一种切分方法,使得完成切分后能给金匠最少的铜币。
距离说明,比如金条长30,需要分给4位长工,每人分到的分别是6,7,8,9。一种切分方式是先切成15和15,然后再分别切分成6和9,7和8,此时地主需要给金匠的铜币最少,一共60个。
输入描述

第一行输入一个整数n,表示长工的人数
第二行输入n个整数数,表示长工分到的金条长度

输出描述

输出分给金匠的最少铜币数

输入示例

4
6 7 8 9

输出示例

60

#阿里巴巴##Java工程师#
全部评论
哈弗曼树???对 就是这个思路。。。
点赞 回复 分享
发布于 2017-08-16 17:26
如大神说的,哈夫曼树实现,有不对的地方请大家指正 public class Main { static class Node{ int v; Node lChild; Node rChild; public Node(){} public Node(int v){ this.v = v; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); List<Node> list = new ArrayList<Node>(); for(int i=0;i<n;i++){ list.add(new Node(scanner.nextInt())); } Node root = createHuff(list); System.out.println(getMin(root)); } private static int getMin(Node node) { if(node.lChild == null){ return 0; } if(node.lChild != null && node.rChild != null){ return node.v + getMin(node.lChild) + getMin(node.rChild); } return 0; } private static Node createHuff(List<Node> list) { while(list.size()>1){ sortList(list); Node parent = new Node(list.get(0).v + list.get(1).v); Node lChild = list.remove(0); Node rChild = list.remove(0); parent.lChild = lChild; parent.rChild = rChild; list.add(parent); } return list.get(0); } private static void sortList(List<Node> list){ for(int i=0;i<list.size();i++){ int index = i; int min = list.get(i).v; for(int j=i+1;j<list.size();j++){ if(min > list.get(j).v) { min = list.get(j).v; index = j; } } if(index != i){ Node tmp = list.get(i); list.set(i, list.get(index)); list.set(index, tmp); } } } }
点赞 回复 分享
发布于 2017-08-16 19:47
一楼正解
点赞 回复 分享
发布于 2017-08-16 18:53
每次找数组能组成的最接近的两个和,然后递归求两边,不知道这样能不能解
点赞 回复 分享
发布于 2017-08-16 18:35

相关推荐

点赞 评论 收藏
分享
可以不说话:笔试a了3道半,今天说是挂了😭😭
投递汇丰科技等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务