这道题我一开始想错了,这么简单的题都wa了两发。。。我往贪心上面想了,每次都找一个最小的数相加,结果就是
排序后直接往后加,还在那纳闷为何出错。。。其实这道题是哈弗曼编码问题,简直是模板题目,就是每次找两个最
小的结点求和后把他们的和放到节点中去,把这两个点删除。。。用的multiset,其实和set容器差不多,就是可
以存放重复的元素。。。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
int main()
{
int i,n,a;
multiset<int>ms;
while(cin >> n,n)
{
for(i=1; i<=n; i++)
{
cin >> a;
ms.insert(a);
}
set<int>::iterator it;
// for(it=ms.begin(); it!=ms.end(); it++)
// cout << *it << " ";
// cout << endl;
int ans = 0;
int sum;
while(ms.size()!=1)
{
sum = 0;
it = ms.begin();
sum += *it;
ms.erase(it);
it = ms.begin();
sum += *it;
ms.erase(it);
ms.insert(sum);
ans += sum;
}
ms.clear();
cout << ans << endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sinat_22659021/article/details/47302433