1011整数转换

来源:互联网 发布:机械加工工艺报价软件 编辑:程序博客网 时间:2024/06/05 16:53

Description

有N个正整数a[1]...a[N],你可以选择一个正整数X,然后以后每一步,你可以使一个数a[i]变成 a[i] + X,或者 a[i] - X。
聪明的你,一定会知道怎么选择这个X,使得最后所有的数都变成相等,而且使用的变化步数最少。

Input

多组测试数据。
对于每组数据,一个N,接下来一行有N个数a[1]...a[N] (1<= a[i] <= 10^6)>。保证这N个数不全相等。

N<=1000

Output


每组数据单独一行,你找出的正整数X,以及最少步数,两个数用一个空格隔开。

Sample Input 

31 2 343 5 7 11

Sample Output

1 22 5

分析:首先要选择一个适当的x,这个x保证要是的a[i]通过数次的加或者减x,数组a所有的数都相等,且希望x是满足此条件的最大(保证转换的步数最小)。

参考代码:

#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<map>using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 10000+10;int n;int a[maxn];int gcd( int a, int b){    if( !b)        return a;    return gcd(b,a%b);}int main(){    while( ~scanf("%d",&n))    {        int s = 0;        for( int i = 1; i <= n; i++)            scanf("%d",&a[i]);        sort( a+1,a+1+n);        int x = 0;        for( int i = 2; i <= n; i++)            x= gcd( x,a[i]-a[i-1]);        int mid = (n+1)/2;        long long ans = 0;        for( int i = 1; i <= n; i++)            ans = ans+abs(a[mid]-a[i])/x;        //for( int i = mid+1; i <= n; i++)          //  ans = ans+(a[i]-a[mid])/x;        printf("%d %lld\n",x,ans);    }    return 0;}


0 0
原创粉丝点击