一、题目内容
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;
}