把一个数能到达的所有数全部保存起来
如果途中的某个数到达的次数==n。说明这个数是n个数都能到达的数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
int v[100000+10]={0};
int step[100000+10]={0};
void f(int num){
int fz=num;
int temp=0;
while(fz<=100000){
v[fz]++;
step[fz]+=temp++;
fz*=2;
}
temp=1;
while(num){
if(num%2==1&&num!=1){
num/=2;
v[num]++;
step[num]+=temp++;
int ff=num*2;
int ftemp=temp;
while(ff<=100000){
v[ff]++;
step[ff]+=ftemp++;
ff*=2;
}
}
else{
num/=2;
v[num]++;
step[num]+=temp++;
}
}
}
int main(){
int n;
cin>>n;
int a[100000+10];
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++){
f(a[i]);
}
int out=1e9;
for(int i=1;i<=100000;i++){
if(v[i]==n) out=min(out,step[i]);
}
cout<<out;
return 0;
}