题意:
- 给n个数,每一个数可以*2或者/2
- 问最少几步可以把这些数统一
思路
- 暴力* /
- num[i] 数组,每一个数到达i 需要几步
- book[I] 有几个数可以到达i
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int book[N],ans[N],a[N];
int n;
int maxv=0;
void solve(int x)
{
int num=x;
int pos=0;
book[num]+=1;
ans[num]+=pos;
while(num<=maxv)
{
num*=2;
pos++;
book[num]+=1;
ans[num]+=pos;
}
num=x,pos=0;
while(num)
{
if(num%2 && num!=1)
{
num/=2;
pos++;
book[num]+=1;
ans[num]+=pos;
int num1=num,pos1=pos;
while(num1<=maxv)
{
num1*=2;
pos1++;
book[num1]+=1;
ans[num1]+=pos1;
}
}
else{
num/=2;
pos++;
book[num]+=1;
ans[num]+=pos;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i];
maxv=max(a[i],maxv);
}
for(int i=1;i<=n;i++)
solve(a[i]);
int res=0x3f3f3f3f;
for(int i=1;i<=2*maxv;i++)
if(book[i]==n)
res=min(res,ans[i]);
cout<<res<<endl;
return 0;
}