参考:http://www.bubuko.com/infodetail-988967.html
/*
题意:把n个数变成相同所需要走的最小的步数
易得到结论,两个奇数不同,一直×2不可能有重叠
枚举每个数可能到得所有值,以及统计达到该值的时候已经走的步数
最终答案就是1到up中num[i]最小的数
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX = 1e5 + 10;
int num[MAX];
int cnt[MAX];
int a[MAX];
const int up = 1e5;
const int inf = 0x3f3f3f3f;
int main()
{
int n;
while(~scanf("%d", &n)){
memset(num, 0, sizeof(num));
memset(cnt, 0, sizeof(cnt));
for(int i = 1; i <= n ; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n ; i++){
int x = a[i];
int pre = 0;
while(x){
int s = 0;
while(x % 2 == 0){
x /= 2;
s++;//从当前偶数到最后的奇数移动的步数
}
int y = x;
int x1 = 0;
while(y <= up){
cnt[y]++;//可以得到的值
num[y] += pre + abs(s - x1);
x1++;
y *= 2;
}
pre += s + 1;//达到该值已经走过的步数,在接着处理一步+1
x /= 2;
}
}
int ans = inf;
for(int i = 1; i <= up ;i++){
if(cnt[i] == n){
ans = min(ans, num[i]);
}
}
printf("%d\n", ans);
}
return 0;
}