E: Translate

题目描述

你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
2 5
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 int GCD(int a,int b)
 8 {
 9     if(b==0)
10         return a;
11     else
12         return GCD(b,a%b);
13 } 
14 int LCM(int a,int b)
15 {
16     int gcd=GCD(a,b);
17     return (a*b)/gcd;
18 }
19 int main()
20 {
21     int n;
22     while(scanf("%d",&n)!=EOF)
23     {
24         int a[1010];
25         int b[1010];
26         for(int i=1;i<=n;i++)
27         {
28             scanf("%d",&a[i]);
29             
30         }
31         sort(a+1,a+1+n);
32         int q=a[(n+1)/2];
33         int gcd;
34         int ans=0;
35         for(int i=1;i<=n;i++)
36         {
37             b[i]=abs(q-a[i]);
38             if(i==1)
39                 gcd=b[i];
40             if(i>=2&&i!=(n+1)/2)
41                 gcd=GCD(gcd,b[i]);
42         }
43         for(int i=1;i<=n;i++)
44         {
45              ans+=abs(a[i]-q)/gcd;
46         }
47         printf("%d %d\n",gcd,ans);
48     }
49     return 0;
50 } 

 

posted on 2017-02-26 14:27  左岸zero  阅读(135)  评论(0编辑  收藏  举报

导航