简要思路:
公差知道了,通过输入数列中的第一项和最后一项,就可以知道最短项数
数学上很容易证明一个等差数列的子数列之间的差值是公差的整数倍
题干中两个条件: 1 等差; 2 最短(要求公差是最大的那个情况);
所以原数列的公差就是子数列中所有数的最大公因数
最大公因数可以用辗转相除法
为简化求最大公因数的过程,可以先将子数列从小到大排序,省去更大的差的情况
思路理清了 开干 塔塔开!塔塔开!塔塔开!!!!!
#include <iostream>
#include <algorithm>
using namespace std;
int arr[100010];
int n;
int gcd(int a, int b){
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
sort(arr,arr+n);
if(arr[0]==arr[n-1]){
printf("%d",n);
}
else{ int res=arr[1]-arr[0];
for(int i=2;i<n;i++){
res=gcd(res,arr[i]-arr[i-1]);
}
printf("%d", (arr[n-1]-arr[0])/res+1);
}
return 0;
}
嗯 那个n不放全局即使思路代码除此之外没有问题,也会WA