二分除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; }