题目链接:点击查看
题意:n个数字,可以乘以2,可以除以2,问总共多少次运算,使n个数一样
题解:因为是*2 /2 运算 数最大为1e5,每个数运算最多400次作左右,我们就暴力把每个数到达的情况都算出来,取一个都能到达的最小值就可以了,优化,每次/2,就在每次去掉一个1的时候在继续乘到最大值即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int sum[N*2],n,step[N*2],num[N*2];
void solve(int x)
{
int m=x;
int st=-1;
while(m<N)
{
st++;
step[m]+=st;
num[m]++;
m<<=1;
//
}
m=x;
st=0;
while(m!=1)
{
// cout<<m<<endl;
while(m%2==0)
{
m>>=1;
st++;
step[m]+=st;
num[m]++;
}
if(m!=1)
{
m>>=1;
st++;
step[m]+=st;
num[m]++;
int mm=m;
int stt=st;
while(mm<N)
{
mm<<=1;
stt++;
step[mm]+=stt;
num[mm]++;
}
}
}
}
int main()
{
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
solve(x);
}
int ans=1e9;
for(int i=1;i<N;i++)
{
if(num[i]==n) ans=min(ans,step[i]);
}
cout<<ans<<endl;
return 0;
}