3.2——11298: 苟利
题目描述
给定正整数n和正整数数组Ai(1≤i≤n),现有n堆石子排成一列,第i堆石子有Ai个,其中对于任一正整数i(i<n),第i堆石子与第i+1堆石子相邻。每次将两堆石子合并成一堆,新堆的石子数是原来两堆石子数之和,代价是原来两堆石子数之积,求合并n−1次将n堆石子合并成一堆的代价和最小是多少。
输入
第一行,一个正整数n。
第二行,n个正整数,第i个正整数表示Ai,相邻两个数之间有一个空格隔开。
输出
仅一行,一个正整数,表示答案。
样例输入
复制样例数据
2 2 2
样例输出
4
提示
对于所有的测试点,满足n≤30000,Ai≤200000。
来源/分类
Java高精度嘛,训练赛一看就是这个玩意。但是为啥训练赛只能用C++。错了n次发现,一直最小乘最小,合并继续,和最大乘最小合并。答案一样,但是数字较大嘛。。。
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class bigint {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
BigInteger a[];
a = new BigInteger [n];
int i;
for(i=0;i<n;i++) {
a[i]=cin.nextBigInteger();
}
Arrays.sort(a);
BigInteger ans=new BigInteger("0");
for(i=0;i<n-1;i++) {
BigInteger b=new BigInteger("1");
b=b.multiply(a[n-1]);
b=b.multiply(a[i]);
ans=ans.add(b);
a[n-1]=a[n-1].add(a[i]);
}
System.out.println(ans);
}
}