SDUTOJ 2848 Fence Repair
题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2848
题目大意:有n块木头,长度分别给出,要把这些木头修成栅栏,每次挑出两块连成一截,并花费这两块木头长度的钱。最终要把所有木块合成一条栅栏,问最少花费多少钱。
题目分析:哈夫曼树经典例题。
code:
#include<cstdio>
#include<queue>
using namespace std;
struct cmp
{
bool operator ()(int &a,int &b)
{
return a>b;//最小值优先
}
};
int main()
{
int i,m,n,t;
long long count;
while(scanf("%d",&n)!=EOF)
{
priority_queue<int,vector<int>,cmp>q;
for(count=i=0;i<n;i++)
{
scanf("%d",&m);
q.push(m);
}
while(!q.empty())
{
m=q.top();
q.pop();
if(q.empty())break;
m+=q.top();
q.pop();
q.push(m);
count+=m;
}
printf("%lld\n",count);
}
return 0;
}
PS:O了