• 经典贪心,哈夫曼编码。


    #include <queue>
    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;

    vector<int> V;

    struct Node {
        int len;
        Node* right;
        Node* left;
        Node(int x = 0) :
            len(x), right(NULL), left(NULL) {}
    };

    class Op {
    public:
        bool operator()(Node* const lhs, Node* const rhs) {
            return lhs->len > rhs->len;
        }
    };

    priority_queue<Node*, vector<Node*>, Op> Q;

    int dfs(Node* p, int level) {
        if(!p) return 0;
        if(p -> left || p -> right)
            return dfs(p->left, level + 1) +
                dfs(p->right, level + 1);
        else return p->len * level;
    }

    void destroy(Node* p) {
        if(!p) return;
        destroy(p->left);
        destroy(p->right);
        delete p;
    }

    int main() {
        // 字符频数
        int C[128] = {};
        // 字符集
        string st = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        // 频度
        int f[] = {186, 64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20,
        57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16, 1};
       
        // 总频数
        int all = 0;
       
        for(int i = 0; i < st.size(); ++i) {
            C[st[i]] = f[i];
            all += f[i];
        }

        // 生成基础节点
        for(int i = 1; i < 128; ++i)
            if(C[i]) Q.push(new Node(C[i]));
        // 替换指针,截取节点
        Node *x, *y, *z;
        // 优先队列合并
        while(!Q.empty()) {
            x = Q.top();
            Q.pop();
            if(Q.empty()) break;
            y = Q.top();
            Q.pop();
            z = new Node(x->len+y->len);
            z -> left = x;
            z -> right = y;
            Q.push(z);
        }
        int p = dfs(x, 0), q = 8 * all;
        if(x->left == NULL && x->right == NULL) p = x -> len;
        destroy(x);
        printf("%d %d %.1lf\n", q, p, double(q)/p);
        system("pause");
    }

  • 相关阅读:
    HPU--1189 Ou à
    实数向整数的强制转换
    HPU--1166 阶乘问题(一)
    HPU--1163 大数A+B
    阿斯伯格综合征完全指南各章链接
    思维改变生活第10章、有效沟通
    Mathematica(MMA)闪电入门系列 目录与说明
    第二语言习得理论介绍
    第二语言习得实践方法
    复赛注意事项:关于文件读写的格式
  • 原文地址:https://www.cnblogs.com/byfei/p/3112235.html
Copyright © 2020-2023  润新知