基础练习 Huffuman树
这题一开始就说用贪心了,我就不再解释需要什么算法了,先贴代码:
#include<iostream>
#include<algorithm>
using namespace std;
//打印数组,为了方便调试代码使用
void Print(int *arr, int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << ' ';
}
cout << endl;
}
//为了说明,就用题目给的数据吧:5 3 8 2 9
int main() {
int n, *arr, sum = 0;
cin >> n;
arr = new int[n + 1];
//在这里构建出一个数组:65535, 5, 3, 8, 2, 9
for (int i = 1; i < n + 1; i++) {
cin >> arr[i];
}
arr[0] = 65535;
//设置一个索引,为下面的贪心设置起点
int index = 0;
while (index < n - 1) {
for (int i = index + 1; i < n + 1; i++) {
if (arr[index] > arr[i]) {
swap(arr[index], arr[i]);
}
}
//执行完第一次后会变成2, 65535, 5, 8, 3, 9
Print(arr, n + 1);
for (int i = index + 2; i < n + 1; i++) {
if (arr[index + 1] > arr[i]) {
swap(arr[index + 1], arr[i]);
}
}
//执行完后变成2, 3, 65535, 8, 5, 9
Print(arr, n + 1);
arr[index + 1] += arr[index];//这里是将两个虽小值加到一起
sum += arr[index + 1];//获取“费用”
arr[index] = 0;//将最小值更新为0
swap(arr[index + 1], arr[index + 2]);
index++;
//第一次贪心后变成65535, 5, 8, 5, 9
Print(arr, n + 1);
}
//打印最后的总“费用”
cout << arr[n] << endl;
return 0;
}
这个是整个代码执行的过程,可以根据这些结果来读代码: