题解 | #游游的除2操作#
游游的除2操作
https://www.nowcoder.com/practice/b797f46aa75145a0bbe112099f7cbd18
考虑所有数的二进制的最长公共前缀的长度,对于每一个数的贡献就是这个数的二进制位的长度减去最长公共前缀的长度
#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'; }