有N个正整数a[1]...a[N],你可以选择一个正整数X,然后以后每一步,你可以使一个数a[i]变成 a[i] + X,或者 a[i] - X。聪明的你,一定会知道怎么选择这个X,使得最后所有的数都变成相等,而且使用的变化步数最少。
多组测试数据。对于每组数据,一个N,接下来一行有N个数a[1]...a[N] (1<= a[i] <= 10^6)>。保证这N个数不全相等。
N<=1000
每组数据单独一行,你找出的正整数X,以及最少步数,两个数用一个空格隔开。
31 2 343 5 7 11Sample 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;}
新闻热点
疑难解答