小塔有一个长度为n的数组a,他定义了一个函数f:f(l,r)=∑k=lrak,即f(l,r)表示数组a在[l,r]这一段区间的区间和。
现在小塔有一个重新任意排列数组a的机会,他想要最小化∑l=1n∑r=lnf(l,r),即最小化所有区间对于f的值之和,请你帮他算算最小的这个值吧。
题目要求枚举左右端点,求解出所有的区间和,这使得每个位置在区间中的贡献不同。例如,在样例1中,所有的子区间为 [1,1],[1,2],[1,3],[2,2],[2,3],[3,3]。其中,位置1贡献2次,位置2贡献4次,位置3贡献2次。题目要求最小化子区间和,因此需要让较大的数贡献较少的次数。将较大的数放在贡献次数少的位置,比如将2和3放在位置1和3,数字1放在贡献次数较多的位置2。最终数组排列结果为[2,1,3]或[3,1,2],最小值为19。
对于每个位置,统计其贡献次数,然后通过排序将数值大的数放置在贡献次数少的位置。对于位置i,包含i的区间[l,r]满足l≤i≤r,因此有0≤l≤i,i≤r<n。位置i的贡献次数nums[i]为(i+1)×(n−i)。最小的贡献即为排序后的每个数乘以对应的贡献次数:
∑arr[i]×nums[i]