为了使得花费最小,就要使越大的数字越晚计算,每次取最小的两个值进行计算。借助最小堆,每次计算最小的两个数,将两个数的和放入最小堆,直至堆的大小为1。
import java.util.*; public class Solution { /** * 返回一个数字表示输出计算n个数字和的最小花费的时间。 * @param n int整型 表示有n个数。 * @param c int整型 参数c * @param a int整型一维数组 ai表示第i个数的大小 * @return long长整型 */ public long solve(int n, int c, int[] a) { long res = 0; PriorityQueue<Integer> pq = new PriorityQueue<>(); for (int i : a) pq.offer(i); while (pq.size() != 1) { int x = pq.poll(); int y = pq.poll(); int xy = x + y; res += xy; pq.offer(xy); } return c * res; } }