AcWing 148. 合并果子
原题链接
简单
作者:
季之秋
,
2021-02-20 22:47:49
,
所有人可见
,
阅读 310
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
PriorityQueue<Integer> p=new PriorityQueue<>(); //小型堆(优先队列)动态变化
for(int i=0;i<n;i++){
p.add(sc.nextInt());
}
int res=0;
while(p.size()>1){ //f[n]=f[n-1]+a+b(a b是f[n]最小值); 每次取出f[i]中最小的两个值合并
int a=p.poll();
int b=p.poll();
//原理:合并次数越多 总值越大,合并总次数是不变的。所以让越小的值合并次数越多,就贪心最好的局面
res+=a+b; //答案就是一直取到f[1]不能合并为止
p.add(a+b); //加入新合并的点,
}
System.out.println(res);
}
}