并没有想到怎么去做,看的别人的思想。
玩的还是暴力。。。。。
把每个数字*2和/2都得到的数字都统计一遍,范围就1e5,能变换到的数字也不会太多,然后找符合条件的,首先就是这n个数都能变换成这个数字,然后变换次数还要是最少的,打个表就完事了
统计的时候,如果当前数字num是个奇数,则num/2要一直*2打表到1e5之外,如果num是个偶数,则num/2则不需要*2向上打表了,因为那些都在num的时候统计过了
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
int step[MAXN+10];
int cnt[MAXN+10];
int n,num;
void process(int num, int nstep)
{
for(int i = num*2; i <= MAXN; i *= 2)
{
cnt[i]++;
step[i] += nstep;
++nstep;
}
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = 0; i < n; ++i)
{
cin >> num;
int nstep = 0;
bool flag = true;
while(num)
{
cnt[num]++;
step[num] += nstep;
if(flag) process(num,nstep+1);
if(num&1) flag = true;
else flag = false;
num /= 2;
++nstep;
}
}
int res = 1e9;
for(int i = 1; i <= MAXN; ++i)
if(cnt[i] == n)
res = min(res,step[i]);
cout << res << endl;
return 0;
}