题目描述
你N个正整数a[1]...a[N],在最初的时候,你选择一个正整数X,然后以后每一步,你可以使一个数a[i] 变成 a[i] + X,或者 a[i] - X,聪明的你,一定会知道怎么选择这个X,使得最后所有的数都变成相等,而且使用的变化步数最少。
输入
多组测试数据。对于每组数据,一个N(2 <= N <= 1000),接下来一行有N个数a[1]...a[N] (1 <= a[i] <= 10^6)。保证这N个数不全相等。
输出
每组数据单独一行,你找出的正整数X,以及最少步数,两个数用一个空格隔开.
样例输入
3
1 2 3
4
3 5 7 11
1 2 3
4
3 5 7 11
样例输出
1 2
2 5
数学题,最少的步数一定是两边的数往中间靠拢,所以排序找出中间的数,而最优的X就是这n个数的最大公约数
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int n,a[1010],b[1010];
int i,k,l,m,sum;
while(scanf("%d",&n)!=EOF)
{
l=0;sum=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(i=1;i<n;i++)
b[l++]=a[i]-a[i-1];
k=b[0];
for(i=1;i<l;i++)
{
k=gcd(k,b[i]);
}
m=(n-1)/2;
for(i=0;i<n;i++)
{
sum+=abs((a[i]-a[m]))/k;
}
printf("%d %d\n",k,sum);
}
return 0;
}