题解 | #游游的除2操作#
游游的除2操作
https://www.nowcoder.com/practice/b797f46aa75145a0bbe112099f7cbd18
对于每个 a[i] ,尝试对它一直除 2 。
a[i] 的代价为 0 ,a[i]/2 的代价为 1 ,a[i]/4 的代价为 2 ,以此类推。
对所有 a[i] 操作后,如果某个数字出现了 n 次,说明所有 a[i] 都能变成那个数字。
对这些合法数字的代价,取最小值。
c++代码:
#include <iostream>
#include <functional>
#include <map>
using namespace std;
const int N=100100;
int a[N];
map<int,int> b,c;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,i,j,ans=1e9;
cin>>n;
for(i=1;i<=n;++i)
cin>>a[i];
for(i=1;i<=n;++i)
for(j=0;(a[i]>>j)>0;++j)
{
++b[a[i]>>j];
c[a[i]>>j]+=j;
}
for(auto &p:b)
if(p.second==n)
ans=min(ans,c[p.first]);
cout<<ans;
return 0;
}
python代码:
n=int(input())
a=list(map(int,input().split()))
b,c=dict(),dict()
ans=10**9
for i in range(0,n):
for j in range(0,32):
if((a[i]>>j)==0):
break
b[a[i]>>j]=b.get(a[i]>>j,0)+1
c[a[i]>>j]=c.get(a[i]>>j,0)+j
for k,v in b.items():
if(v==n):
ans=min(ans,c[k])
print(ans)
java代码:
import java.util.*;
public class ZT10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt(),i,j,ans=(int)1e9;
int[] a=new int[n+5];
Map<Integer,Integer> b=new HashMap<>();
Map<Integer,Integer> c=new HashMap<>();
for(i=1;i<=n;i++)
a[i]=sc.nextInt();
for(i=1;i<=n;i++)
for(j=0;(a[i]>>j)>0;++j){
b.put(a[i]>>j,b.getOrDefault(a[i]>>j,0)+1);
c.put(a[i]>>j,c.getOrDefault(a[i]>>j,0)+j);
}
for(Integer key:b.keySet())
if(b.get(key)==n)
ans=Math.min(ans,c.get(key));
System.out.print(ans);
}
}