您的位置:首页 > Web前端

POJ 3253 Fence Repair

2010-10-27 16:59 204 查看
本题是简单的赫夫曼,因为每次将他们分开两半的时候都要按照长度收费,也就是说第一次被分开的只收费了一次,第二次被分开的收费了二次(因为前面已经收费了一次)......第n次分开的要收费n次。就是求如何合理的安排是的总费用最小,这是典型的最优生成树的问题,本题可以不用建树,根据所给的数据计算一下总的权值即可。

本题虽简单,但还是水了一把,主要是对总权值的计算理解错了,每次从优先队列中拿出两个最小的算出和,总全职加上这个和,然后把这个和插入到优先队列里。还有,数据量比较大,总权值用long long。

#include <algorithm>
#include <queue>
#include <functional>
#include <cstdio>
using namespace std;

int num[20001],tol,sum;
long long res;

int main(void)
{
while(scanf("%d",&tol)!=EOF)
{
int i;
for(i=0; i<tol; ++i)
scanf("%d",&num[i]);
priority_queue<int,vector<int>,greater<int> > que (num,num+tol);
res=0;
while(true)
{
sum=0;
sum+=que.top();
que.pop();
if(que.empty())
break;
sum+=que.top();
que.pop();
res+=sum;
que.push(sum);
}
printf("%lld/n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: