输入样例:
5
2 6 4 10 20
输出样例:
10
样例解释
包含 2、6、4、10、20的最短的等差数列是 2、4、6、8、10、12、14、16、18、20。
解题思路:
等差数列 An = A1 + nd,项数 n = (An - A1) / d,要想项数n最小,而An和A1是数列中的最大值和最小值,所以只需要将公差d为最大值,即只要求出数列中每个后一项减前一项的最大公约数即可。
Java代码:
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] split = br.readLine().split(" ");
int []arr = new int[n];
for(int i = 0; i < n; i++)
arr[i] = Integer.parseInt(split[i]);
Arrays.sort(arr);
int d = 0, min = arr[0], max = arr[n - 1]; // 公差,首项,末项
for(int i = 1; i < n; i++)
d = gcd(d, arr[i] - arr[i - 1]);
if(d == 0)System.out.println(n);
else System.out.println((max - min) / d + 1);
}
public static int gcd(int a, int b) { // 欧几里得算法,求最大公约数
return b != 0 ? gcd(b, a % b) : a;
}
}
|