题目要求把一长段木板切成 n份长度的小木板 每次把x长度切成x1和x2 的花费是 X。。求最小的花费
构造一个哈夫曼树,把n个长度放到优先队列。每次取出前2个小的x1,x2,然后用ans累计他们的和,把x1+x2放进队列,直到最后队列为空
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define inf 0x7f7f7f7f
using namespace std;
const __int64 maxn = 100005;
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}
struct cmp
{
bool operator ()(__int64 a,__int64 b) const
{
return a>b;
}
};
priority_queue <__int64,vector<__int64>,cmp> qq;
int main()
{
__int64 i,j,n;
scanf("%I64d",&n);
__int64 tmp;
for (i=1;i<=n;i++)
{
scanf("%I64d",&tmp);
qq.push(tmp);
}
__int64 ans=0;
while(!qq.empty())
{
__int64 t1=qq.top();
qq.pop();
__int64 t2=qq.top();
qq.pop();
ans+= t1+t2;
if (qq.empty())
break;
qq.push(t1+t2);
}
printf("%I64d\n",ans);
return 0;
}