二分除2结果的最小值
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
void work()
{
int n;cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++)
cin>>a[i];
int l = 0;
int r = 1e9+7;
auto check = [&](int k) ->bool
{
vector<int> t = a;
for(int i=1;i<=n;i++)
{
while(t[i]>k)
t[i]/=2;
}
for(int i=2;i<=n;i++)
if(t[i]!=t[i-1])
return false;
return true;
};
int ans = 0;
while(l<=r)
{
int mid = (l+r)/2;
if(check(mid))
l = mid+1,ans = mid;
else
r = mid-1;
}
int cnt = 0;
for(int i=1;i<=n;i++)
{
while(a[i]>ans)
a[i]/=2,cnt++;
}
cout<<cnt;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// int t=1;
// cin>>t;
// while(t--)
work();
return 0;
}

京公网安备 11010502036488号