注意和AcWing 282. 石子合并的区别,石子合并每次只能合并相邻的两堆,所以使用区间合并
本题依次可以合并任意两堆,重量越大的一堆被合并的优先级应该更靠后
如$a<b<c$,那么先合并前两堆的结果为$sum_1=(a+b)+[(a+b)+c]=2a+2b+c$,先合并后两堆的结果为$sum_2=(b+c)+[a+(b+c)]=a+2b+2c$
贪心策略:优先合并当前重量最小的两堆
每次取最小的前两个数,考虑使用优先队列PtiorityQueue
,默认小根堆
代码
import java.util.*;
import java.lang.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
static int n;
public static void main(String[] args) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
n = scanner.nextInt();
for (int i = 1; i <= n; i++) pq.add(scanner.nextInt()); // 所有重量扔进队列
int sum = 0;
while (pq.size() > 1) { // 仅剩一个时不需要合并
int a = pq.poll(); // 出队前两个
int b = pq.poll();
int c = a + b; // 合并后的新堆重量
pq.add(c); // 新堆添加到队列
sum += c; // 合并消耗的体力值
}
System.out.println(sum);
}
}