ptaL1-071 前世档案(哈夫曼编码)

Posted 进击的alphaCat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ptaL1-071 前世档案(哈夫曼编码)相关的知识,希望对你有一定的参考价值。

题目来源

==> pta 团体程序设计天梯赛-练习集/L1-071 前世档案

方法:哈夫曼编码,20分

把“是”看成 “0”, “否” 看成 “1”,从输入的序列逆序后得到每一种结论的哈夫曼编码。
通过二进制转十进制运算可以得到结论数字,当然最后要自增一下,因为结论是从1开始的。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cctype>

// cout<<fixed<<setprecision(2); 保留小数
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;

// 哈夫曼编码 
int main()

    int N, M;
    cin >> N >> M;
    cin.get();
    while ( M-- ) 
        string answer;
        getline(cin, answer);
        int ret(0), weight(1);
        string::const_reverse_iterator riter = answer.rbegin();
        while ( riter != answer.rend() ) 
            // 逆序编码, n 为 1
            if ( *riter++ == 'n' ) ret += weight;
            weight *= 2;
        
        cout << ++ret << endl;
    


// 类似二分查找, 15分
// int main()
// 
//     int N, M;
//     cin >> N >> M;
//     cin.get();
//     while ( M-- ) 
//         string answer;
//         int head(1), tail( pow(2, N) );
//         int mid;
//         getline(cin, answer);
//         for ( auto a: answer) 
//             mid = (head + tail) / 2;
//             if ( a == 'y' ) tail = mid;
//             else head = mid + 1;
//         
//         mid = (head + tail) /2;
//         cout << mid << endl;
//     
// 

ps:注释的方法是一开始想的类似于二分查找,但不知为啥只能拿15分…

以上是关于ptaL1-071 前世档案(哈夫曼编码)的主要内容,如果未能解决你的问题,请参考以下文章

ptaL1-071 前世档案(哈夫曼编码)

哈夫曼编码问题,高手帮我

哈夫曼编码(贪心算法)

哈夫曼编码C语言实现

霍夫曼编码

哈夫曼编码怎么求