合并石子(哈夫曼方法)
//哈夫曼(最优二叉树)方法 建树//非指针做法//数据如果很大的话,有可能会超时 #include <iostream> #define maxn 10000+10000+3 using namespace std; class T { public: int data,parent,left,right; }tree[maxn]; int f[maxn] = {0}; int search (int k) { int min1 = 99999999; int pos; for (int i = 0;i<k;i++) { if (!f[i] && tree[i].data < min1) { min1 = tree[i].data; pos = i; } } f[pos] = 1; return pos; } void Huffman(int n) { for (int k = n;k<2*n-1;k++) { int pos1 = search (k); tree[pos1].parent = k;tree[k].left = pos1; int pos2 = search (k); tree[pos2].parent = k;tree[k].right = pos2; tree[k].data = tree[pos1].data + tree[pos2].data; } } int main () { int n; cin >> n; for (int i=0; i<n;i++) { cin >> tree[i].data; } Huffman(n); long long sum = 0; for (int i=n;i<2*n-1;i++) { sum += tree[i].data; } cout << sum << endl; } //哈夫曼(最有二叉树)非建树的方法//比较优化 #include <iostream> #define maxn 10005 using namespace std; int main () { int n; int ans = 0; int a[maxn]; cin >> n; for (int i=0;i<n;i++) { cin >> a[i]; } int pos1,pos2; while (n>1) { int min1 = 999999999; for (int i=0;i<n;i++) { if (a[i]<min1) { pos1 = i; min1 = a[i]; } } int min2 = 999999999; for (int i=0;i<n;i++) { if (a[i]<min2 && i != pos1) { pos2 = i; min2 = a[i]; } } a[pos1] = min1 + min2; ans += a[pos1]; a[pos2] = a[n-1]; n--; } cout << ans << endl; }