考虑所有数的二进制的最长公共前缀的长度,对于每一个数的贡献就是这个数的二进制位的长度减去最长公共前缀的长度
#include <iostream> #include <vector> using namespace std; int main() { int n; cin>>n; vector<int> a(n); vector<vector<int>> ans(n); int mi=1e9+7; int S=100; for(int i=0;i<n;i++){ cin>>a[i]; int ok=0; for(int j=30;j>=0;j--){ if((a[i]>>j&1))ok=1; if(!ok){ continue; } else{ ans[i].push_back(a[i]>>j&1); } } S=min(S,(int)ans[i].size()); } int p=0; for(int j=0;j<S;j++){ int l=0; int y=0; for(int i=0;i<n;i++){ l+=(ans[i][j]==0); y+=(ans[i][j]==1); } if(l==n||y==n){ p++; } else{ break; } } int res=0; for(int i=0;i<n;i++){ res+=ans[i].size()-p; } cout<<res<<'\n'; }