一、题目内容
POJ 3253 原题地址
二、题意解释
有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度,给定各个要求的小木板的长度,及小木板的个数n,求最小费用
如
3
8 8 5:
先从无限长的木板上锯下长度为 21 的木板,花费 21
再从长度为21的木板上锯下长度为5的木板,花费5
再从长度为16的木板上锯下长度为8的木板,花费8
总花费 = 21+5+8 =34
三、代码及注释
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long l1;
int n,L[20001];
priority_queue<int, vector<int>,greater<int> > que;
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&L[i]);
que.push(L[i]);
}
l1 ans=0;
while(que.size()>1){
int num1=que.top();
que.pop();
int num2=que.top();
que.pop();
que.push(num1+num2);
ans+=(num1+num2);
}
printf("%lld\n",ans);
}
return 0;
}