题目描述:
在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max−min。
解题思路:
首先解决这道题要有一些数学知识,我举例说明,写了四个整数是1,3,5,7 ,第一种结合方式是从小到大结合,1结合3,它们的结果继续结合5,最后得到的结果是最大值,第二种结合方式是从大到小结合,5结合7,它们的结果继续结合3,这样最后得到的结果是最小值,其他的结合方式得到的结果都在它们之间(可以自己多尝试一下)。
代码:
package lanqiao;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int m[];
static Integer n[] ;
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
m = new int[a];
n = new Integer[a];
for (int i = 0; i < a; i++) {
m[i] = in.nextInt();
n[i] = m[i];
}
//升序排序
Arrays.sort(m);
for (int i = 1; i < a; i++) {
m[i] = m[i] * m[i - 1] + 1;
Arrays.sort(m);
}
int max = m[a - 1];
Arrays.sort(n, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i = 1; i < a; i++) {
n[i] = n[i - 1] * n[i] + 1;
/*而求最小值的时候就不用sort每次都排序,因为前边两个最大的数乘起来
的数不可能会比后边小的数还要小*/
}
int min = n[a - 1];
// System.out.println(max + " " + min);
System.out.println(max - min);
}
}