思路:找最终的木棍长度
#include <bits/stdc++.h>
using namespace std;
int n,a[55];
int findans(int num, int a)
{
int cot=0,top=a,down=a;
while (down < num)
{
if (top>=num && down<=num)
break;
cot++;
top = top*2+1;
down = down*2-1;
}
if (down > num)
return -1;
else
return cot;
}
queue<int > ll;
int main()
{
int res=-1, minn=1e9;
scanf("%d",&n);
for (int i=1; i<=n; i++){
scanf("%d",&a[i]);
minn = min(minn,a[i]);
}
ll.push(minn);
int l;
while (res == -1)
{
l = ll.front();
ll.pop();
res = 0;
for (int i=1; i<=n; i++)
{
int tmp = findans(a[i],l);
if (tmp == -1){
res = -1;
break;
}
else{
res += tmp;
}
}
if (l%2 == 0){
ll.push(l/2);
}
else {
ll.push((l+1)/2);
ll.push((l-1)/2);
}
}
printf("%d",res);
return 0;
}