原题:http://poj.org/problem?id=3253
题意:给n个木条,让你用一块木板切出来,代价是两块木板的长度和。求最小代价
题解:我们发现很有意思的性质,将n个数加起来,和切出来本质上是一样的。不妨来贪心,挑选两个最小的加起来,然后将它加回原序列。可以用堆维护。
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> > q;
int n;
int main(){
scanf("%d",&n);
for(int i=1,x;i<=n;i++){
scanf("%lld",&x);
q.push(x);
}
ll ans=0;
while(q.size()>1){
// printf("%d",q.top());
ll t1=q.top();q.pop();
ll t2=q.top();q.pop();
//q.pop();
ans+=t1+t2;
q.push(t1+t2);
}
printf("%lld\n",ans);
return 0;
}