题目:http://poj.org/problem?id=3253
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 50005
using namespace std;
struct cmp{
bool operator ()(long long &a,long long &b){
return a>b;
}
};
int main(){
int n;
long long ans = 0;
priority_queue<long long,vector<long long>,cmp>q;
cin>>n;
long long tmp;
for(int i = 0; i < n; i++){
scanf("%lld",&tmp);
q.push(tmp);
}
for(int i = 0; i < n-1; i++){
tmp = q.top();
q.pop();
tmp += q.top();
q.pop();
q.push(tmp);
ans += tmp;
}
cout<<ans;
}
总结: 这是一道关于哈夫曼树的题目. 一般做法是将输入放进数组里, 每次对数组排序, 取出(并删除)数组中最小的两个数, 相加并插入回数组中, 循环操作直到数组中只剩一个元素. 那么答案就是每次循环时插入的那个数的和. 如果按照普通做法来做, 每次循环都要进行排序, 会浪费太多时间导致TLE. 而优先队列正好解决了这个问题, 数组在插入时就会自动排好序, 耗时只有63ms.