题目大意

可以合并两堆果子成一堆新果子,消耗两堆果子数目之和的体力。给定 $n$ 堆果子的数目 $a_i$,求体力耗费最小的方案。

分析

很容易猜到贪心结论,不断选取两个最小的堆进行合并。

priority_queue<int, vector<int>, greater<int> > q;

int main() {
	int n = rr();
	for (ll i = 1; i <= n; i++) {
		int t = rr();
		q.push(t);
	}
	int sum = 0;
	while (q.size() >= 2) {
		int x = q.top(); q.pop();
		int y = q.top(); q.pop();
		sum += x + y;
		q.push(x + y);
	}
	printf("%d\n", sum);
	return 0;
}

本质上是证明 Huffman 树的构造的正确性,有点复杂。