分金币的问题
思路 一:
使用huffman树实现
代码:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Queue;
//创建Huffman树的节点
class Node<T> implements Comparable<Node<T>> {
private double weight;
private Node<T> left;
private Node<T> right;
public Node(double weight) {
this.weight = weight;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public Node<T> getLeft() {
return left;
}
public void setLeft(Node<T> left) {
this.left = left;
}
public Node<T> getRight() {
return right;
}
public void setRight(Node<T> right) {
this.right = right;
}
public String toString() {
return "weight : " + this.weight + "\n";
}
public int compareTo(Node<T> other) {
return (int) (other.getWeight() - this.getWeight());
}
}
//创建Huffman树
class HuffmanTree<T> {
static <T> Node<T> createTree(List<Node<T>> nodes) {
while (nodes.size() > 1) {
Collections.sort(nodes);
Node<T> left = nodes.get(nodes.size() - 1);
Node<T> right = nodes.get(nodes.size() - 2);
Node<T> parent = new Node<T>(left.getWeight() + right.getWeight());
parent.setLeft(left);
parent.setRight(right);
nodes.remove(left);
nodes.remove(right);
nodes.add(parent);
}
return nodes.get(0);
}
static <T> List<Node<T>> breadth(Node<T> root) {
List<Node<T>> list = new ArrayList<Node<T>>();
Queue<Node<T>> queue = new ArrayDeque<Node<T>>();
if (root != null) {
queue.offer(root);
}
while(!queue.isEmpty()) {
list.add(queue.peek());
Node<T> node = queue.poll();
if (node.getLeft() != null) {
queue.offer(node.getLeft());
}
if (node.getRight() != null) {
queue.offer(node.getRight());
}
}
return list;
}
}
public class 分金币_huffman编码 {
public static void main(String[] args) {
List<Node<Integer>> list = new ArrayList<Node<Integer>>();
list.add(new Node<Integer>(2));
list.add(new Node<Integer>(3));
list.add(new Node<Integer>(4));
list.add(new Node<Integer>(5));
list.add(new Node<Integer>(6));
list.add(new Node<Integer>(7));
list.add(new Node<Integer>(9));
Node<Integer> root = HuffmanTree.createTree(list);
list = HuffmanTree.breadth(root);
int sum = 0;
for (int i = 1; i < list.size(); i++) {
sum += list.get(i).getWeight();
}
System.out.println(sum);
Object o = new Object();
}
}
思路二:
优先队列实现
代码:
import java.util.PriorityQueue;
import java.util.Scanner;
public class 分金币_优先队列 {
public static int getMinPrice(int[] prices){
int len = prices.length;
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(len);
for (int i = 0; i < len; i++) {
queue.add(prices[i]);
}
int sum = 0;
while(!queue.isEmpty()) {
int first = queue.poll();
if (!queue.isEmpty()) {
int second = queue.poll();
int third = first + second;
sum += third;
queue.add(third);
}
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] prices = new int[n];
for (int i = 0; i < n; i++) {
prices[i] = sc.nextInt();
}
System.out.println(getMinPrice(prices));
}
sc.close();
}
}