基础练习 Huffuman树
解法一:
import java.util.Arrays;
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int []arr=new int[n];//定义一个数组用来装一个数列
int []brr=new int[n];//定义一个数组求出用来装该数列构造Huffman树的最小的两个数之和费用
for (int i = 0; i < n; i++) {//这个循环用来把从键盘输出的数存入arr数组
arr[i]=scanner.nextInt();
}
for (int i = 0; i <n; i++) {
Arrays.sort(arr);//对数组arr进行从小到大排序
if (i==n-1) {
brr[i]=arr[i];
}
else {
brr[i+1]=arr[i]+arr[i+1];//最小的两个数之和(计算完了的没管)
arr[i+1]=brr[i+1];//求和之后把新数值放回arr数组中
}
}
int sum=0;
for (int i = 0; i <n; i++) {
sum=sum+brr[i];
}
System.out.println(sum);
}
}
分析图:这个没有用完最小的两个数相加求和后就把其删除,而是把他们放在前面不去管它,再计算后面的数,这个图是分析图。
解法二:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
list.add(a);
}
boolean flag = true;
int sum = 0;
while (flag) {
if (list.size() < 2) {
System.out.println(sum);
flag = false;
} else {
int cc[] = new int[list.size()];
for (int i = 0; i < cc.length; i++) {
cc[i] = list.get(i);
}
Arrays.sort(cc);
int b = cc[0];
int c = cc[1];
int d = b + c;
list.remove(Integer.valueOf(b));
list.remove(Integer.valueOf(c));
sum += d;
list.add(d);
}
}
}
}