解析
贪心、位运算
从高位到地位枚举,每次判断当前的 s u m sum sum 能否由后面的数位表示,如果可以则直接跳过当前位。否则,当前位应使用,并且尽可能最大的放在当前位。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
const int mod=1e9+7;
const int N=1e5+5;
int n;
void solve(){
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
sum+=x;
}
int ans=0;
for(int i=62;i>=0;i--){
int t=(1<<i)-1;
int w=t+1;
if(t*n>=sum){
continue;
}
ans+=w;
int p=min(n,sum/w);
sum-=w*p;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int tt=1;
// cin>>tt;
while(tt--) solve();
return 0;
}