题目描述
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入描述:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出描述:
输出权值。
示例1
输入
5
1 2 2 5 9
输出
37
备注
原本想优化一下答案,但是耗时没什么改变…
解答1
import java.util.Arrays;
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt(), sum = 0;
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
for(int i = 0; i < n - 1; i++) {
Arrays.sort(nums);
nums[i + 1] = nums[i] +nums[i + 1];
nums[i] = 0;
sum += nums[i + 1];
}
System.out.println(sum);
}
}
}
解答2
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt(), sum = 0, j = 1;
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
int i = 0;
while(i < n - j) {
Arrays.sort(nums);
int[] nums1 = new int[n - j];
nums[1] = nums[0] + nums[1];
sum += nums[1];
System.arraycopy(nums, 1, nums1, 0, n - j);
nums = nums1;
j++;
}
System.out.println(sum);
}
}
}
解答3
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt(), sum = 0;
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
for(int i = 0; i < n - 1; i++) {
Arrays.sort(nums, i, n);
nums[i + 1] = nums[i] +nums[i + 1];
nums[i] = 0;
sum += nums[i + 1];
}
System.out.println(sum);
}
}
}
来源:CSDN
作者:漆黑丶
链接:https://blog.csdn.net/weixin_44485744/article/details/104750101