蓝桥杯:等差数列
题解:
此题为明显的gcd(最大公约数)问题。
首先明白我们想要组成的等差数列最短,那么在我们对给定的几个整数排好序后,最大和最小的的一定是边界项。
既然边界已经固定,我们只需要确定公差即可。
又因为想要数列长度尽可能的短,因此我们尽量去选择最大的公差。
而公差与什么有关呢?
我们可以得知其与每两个数之间的间隔有关,即最大公差即为每两个数之间的间隔的gcd。
在求最大公约数时我们可以先找定其理想上的最大公约数,即几个整数中最小的那个。(因为公约数不能大于数本身)
然后看其是否满足要求,即是否能被整除,不满足则减小直到找到即可。
代码:
#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
int a[100000];
int cmp(const void*x,const void*y)
{
int a = *(int*)x;
int b = *(int*)y;
return a>b?1:-1;
}
int main()
{
int n;
int d;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(int),cmp);
int*b = (int*)malloc(sizeof(int)*n);
memset(b,INT_MAX,sizeof(b));
for(int i=1;i<n;i++)
{
b[i-1] = a[i]-a[i-1];
}
qsort(b,n-1,sizeof(int),cmp);
for(int j=b[0];;j--)
{
int flag = 0;
for(int k=0;k<n-1;k++)
{
if(b[k]%j==0)
{
flag++;
}
}
if(flag==n-1)
{
d = j;
break;
}
}
int length = (a[n-1]-a[0])/d+1;
printf("%d",length);
return 0;
}