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;
}
TOP