有N個正整數(shù)a[1]...a[N],你可以選擇一個正整數(shù)X,然后以后每一步,你可以使一個數(shù)a[i]變成 a[i] + X,或者 a[i] - X。聰明的你,一定會知道怎么選擇這個X,使得最后所有的數(shù)都變成相等,而且使用的變化步數(shù)最少。
多組測試數(shù)據(jù)。對于每組數(shù)據(jù),一個N,接下來一行有N個數(shù)a[1]...a[N] (1<= a[i] <= 10^6)>。保證這N個數(shù)不全相等。
N<=1000
每組數(shù)據(jù)單獨一行,你找出的正整數(shù)X,以及最少步數(shù),兩個數(shù)用一個空格隔開。
31 2 343 5 7 11Sample Output
1 22 5分析:首先要選擇一個適當(dāng)?shù)膞,這個x保證要是的a[i]通過數(shù)次的加或者減x,數(shù)組a所有的數(shù)都相等,且希望x是滿足此條件的最大(保證轉(zhuǎn)換的步數(shù)最小)。
參考代碼:
#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;}
新聞熱點
疑難解答