牛牛和牛妹喜欢玩平板游戏,游戏一开始屏幕上会出现很多个图形,玩家在每一轮可以合并两个图形,当只有一个图形的时候游戏结束,每个图形都有一个大小,合并完成后的图形的大小为x+y,x和y分别为合并之前的两个图形,与此同时,玩家会获得x*y的分数。
牛牛和牛妹新开了一盘游戏,屏幕上出现了n个图形,每个图形的大小已知,请算出牛牛和牛妹最大能获得的分数
输入描述:
第一行输入一个整数n (2≤n≤100)
第二行输入n个整数范围在1到100之间
输出描述:
输出一个整数
示例1
输入
3
1 2 3
输出
11
示例2
输入
2
3 4
输出
12
每次合并两个数,这两个数的乘积会被计入总得分。而这两个数被合并成一个新的数,参与后续的合并。所以,每个原始的数会被多次乘到其他数中。例如,假设数a被合并到某个数中,
然后合并后的数又与另一个数合并,此时a的贡献会乘上另一个数的值。所以,每个数的贡献等于它与其他所有数的乘积之和。例如,数a和所有其他数的乘积之和等于a乘以其他数的总和。
例如,考虑三个数a,b,c。合并顺序有两种:
方式1:a+b,然后合并总和与c。总得分是ab + (a+b)c = ab +ac +bc.
方式2:b+c,然后合并a。总得分是 bc +a(b+c) = ab+ac+bc.
所以,不管顺序如何,总得分是相同的。这说明,对于三个数来说,总得分等于所有两两乘积之和。
数学上有一个公式,可以快速计算这个总和。即,(a1 +a2 +…+an)^2 - (a1^2 + a2^2 + … + an^2) 的结果除以2。因为总和的平方等于每个数的平方之和加上两倍的各两两乘积之和。所以,两两乘积之和等于(总和平方 - 各数平方和)除以2。
方法思路
数学公式推导:所有两两乘积之和可以通过以下公式计算:
总得分=[ (∑a i) 2−∑a i2]/2
其中∑ai 是所有数的总和,∑ai2是所有数的平方和。
输入处理:读取输入的图形数量及其大小。
计算总和和平方和:遍历所有图形,计算它们的总和和平方和。
应用公式计算结果:代入公式计算结果并输出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long sum = 0, sumSq = 0;
for (int i = 0; i < n; i++) {
int num = sc.nextInt();
sum += num;
sumSq += num * num;
}
long result = (sum * sum - sumSq) / 2;
System.out.println(result);
}
}