POJ#3253
题意:一块木板,锯成N段,每段长度已知,每锯一次的费用为当前木板长度,求最小费用
尽可能每一锯将木板一分为二,这样代价最小,由此想到haffman编码~
由于只需要求最小代价,即每次切割的木板长度,所以不需要建树,直接用优先队列即可
// 农夫钜木,费用是每块木板的长度,求最小费用。
public int minCost(int cuts[]) {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(10,
Collections.reverseOrder());
for (int i = 0; i < cuts.length; i++)
pq.add(cuts[i]);
int minCost = 0;
while (pq.size() > 1) {
int sumlen = pq.poll() + pq.poll();
minCost += sumlen;
pq.add(sumlen);
}
return minCost;
}