说一下该题的思路:
已知一定部分的数列,即已知题目所需数列的最大项和最小项,我们不可能主动改变其最大项和最小项,不然就不是最少项数的数列了,所以我们肯定是在这最大项和最小项之间增加项数使之变成一个完整的等差数列
然后我们的目标是找到那个项数最少的等差数列,并且输出这个项数,那么如果我们想要一个等差数列项数最少,这个等差数列必然公差最大。
我们已知一定部分的数列,即我们已经知道了一些可构成等差数列的公差(或者说最少项数数列公差的倍数),即一串公差,我们在其中找到它们的共同约数即可,而我们又要最大的公差,所以我们求出它们的最大公约数即可!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
坑点:常数列也是等差数列!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
int t;
if(a<b)
{
t=a;
a=b;
b=t;
}
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int n,d;
cin>>n;
long long num[n];
int alld[n];
for(int i=0;i<n;i++)
{
cin>>num[i];
}
sort(num,num+n);
if(num[0]==num[1])
{
printf("%d",n);
return 0;
}
for(int i=0;i<n-1;i++)
{
alld[i]=(abs(num[i]-num[i+1]));
}
for(int i=0;i<n-2;i++)
{
d=gcd(alld[i],alld[i+1]);
}
printf("%d",(num[n-1]-num[0])/(d)+1);
return 0;
}