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 前世档案(哈夫曼编码)的主要内容,如果未能解决你的问题,请参考以下文章