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);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值