https://vjudge.net/problem/POJ-3253
给定你一个木板,问你切成m快,每次分割成两个时,花费为这个木板的长度,问你最小花费。
倒着,就是一个霍夫曼树,直接优先队列模拟。
也算一种贪心的策略
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct cmp{
bool operator()(int x,int y){
return x>y;
}
};
int main()
{ int t;
int a;
scanf("%d",&t);
priority_queue<int,vector<int>,cmp>q;
for(int i=0;i<t;i++){
scanf("%d",&a);
q.push(a);
}
long long sum=0;
while(q.size()!=1){
int u1=q.top();
q.pop();
int u2=q.top();
q.pop();
q.push(u1+u2);
sum+=1l*u1+1ll*u2;
}
printf("%lld\n",sum);
return 0;
}