BASIC-28 Huffuman树
Huffuman树
原理很简单,每次都加最小的两个数字就可以
首先把数组从小到大排序
把最小的两个数字a[0]和a[1]相加,和放在a[0]的位置
从a[1]往后每个数字都前移
再排序,继续……
需要注意排序的范围,因为实际上数组的最后永远会有初始数组中最大的数字
所以sort的范围需要每次改变
我的错误出现在把sum(所有和)和a[0](两个较小数字的和)弄混了
阴差阳错过了样例
但是有所有测试点没有通过
最后发现哈夫曼树的总费用需要每次的a[0]都加一遍
解决
code
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a[] = new int[n];
int i, j;
int sum = 0;
for (i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
for (i = 0; i < n - 1; i++) {
Arrays.sort(a, 0, n - i);
a[0] = a[0] + a[1];
sum += a[0];
for (j = 1; j < n - 1; j++) {
a[j] = a[j + 1];
}
/*
* for (j = 0; j < n; j++) { System.out.print(a[j] + " "); }
* System.out.println();
*/
}
System.out.println(sum);
}
}
BASIC-29 高精度加法
高精度加法
这道题去年没有做对
所以今年如果做出来了应该很有成就感
首先不要慌,方法在题目钟已经给出
需要注意的就是加的方法和进位的问题
我的方法在开头进行了很多次类型转换
读入时使用的是String
但是逆序需要用StringBuffer,所以转换一下
然后再转回String
然后通过字符ASCII码与数字的关系
将输入字符串的逆序以数字方式存储在整型数组中
数组开三个,两个是加数,一个是和
这时开的数组的大小应为较长字符串长度加一(便于结果的进位)
较短的数字在数组存储中占不到的地方用0代替
注意两个数组的最后一位均为0
执行加运算时,需要注意上一位的进位问题和下一位的进位
错了第一次的原因是在判断长度填充0的时候位置放在了else大括号的外面
纯属粗心问题
然后很简单地过了
就很棒很简单
code
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String s1 = scanner.next();
String s2 = scanner.next();
StringBuffer buffer1 = new StringBuffer(s1);
StringBuffer buffer2 = new StringBuffer(s2);
buffer1.reverse();
buffer2.reverse();
String str1 = new String(buffer1);
String str2 = new String(buffer2);
// System.out.println(str1);
// System.out.println(str2);
int len1 = str1.length();
int len2 = str2.length();
int maxn = Math.max(len1, len2);
int a[] = new int[maxn + 1];
int b[] = new int[maxn + 1];
int c[] = new int[maxn + 1];
int t = 0;
int i, j;
a[maxn] = 0;
b[maxn] = 0;
for (i = 0; i < maxn; i++) {
if (maxn > len1) {
if (i < len1) {
a[i] = (int) str1.charAt(i) - (int) '0';
} else {
a[i] = 0;
}
b[i] = (int) str2.charAt(i) - (int) '0';
} else {
if (i < len2) {
b[i] = (int) str2.charAt(i) - (int) '0';
} else {
b[i] = 0;
}
a[i] = (int) str1.charAt(i) - (int) '0';
}
}
/*
* for (i = 0; i < maxn; i++) { System.out.print(a[i] + " "); }
* System.out.println(); for (i = 0; i < maxn; i++) { System.out.print(b[i] +
* " "); } System.out.println();
*/
int sum = 0;
for (i = 0; i < maxn + 1; i++) {
sum = a[i] + b[i] + t;
if (sum / 10 != 0) {
t = sum / 10;
} else {
t = 0;
}
c[i] = sum % 10;
}
if (c[maxn] != 0) {
System.out.print(c[maxn]);
}
for (i = maxn - 1; i >= 0; i--) {
System.out.print(c[i]);
}
}
}
BASIC-30有思路了
明天继续努力