合并石子(哈夫曼方法)

//哈夫曼(最优二叉树)方法 建树//非指针做法//数据如果很大的话,有可能会超时
#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;
}

 

posted @ 2014-02-20 19:17  闪光阳  阅读(429)  评论(0编辑  收藏  举报