import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = in.nextInt();
        }

        Map<Integer, Integer> countMap = new HashMap<>();
        Map<Integer, Integer> freqMap = new HashMap<>();

        for (int num : a) {
            int v = num;
            int k = 0;
            while (true) {
                countMap.put(v, countMap.getOrDefault(v, 0) + k);
                freqMap.put(v, freqMap.getOrDefault(v, 0) + 1);
                if (v == 0) {
                    break;
                }
                v = v / 2;
                k++;
            }
        }

        int minOps = Integer.MAX_VALUE;
        for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
            int v = entry.getKey();
            int total = entry.getValue();
            if (freqMap.get(v) == n && total < minOps) {
                minOps = total;
            }
        }

        System.out.println(minOps);
    }
}

https://www.nowcoder.com/discuss/727521113110073344

思路:

  1. 输入处理:读取数组长度和元素。
  2. 生成候选值:对于每个元素,通过不断除以2生成所有可能的候选值,并记录每个候选值的操作次数。
  3. 统计操作次数和出现次数:使用两个哈希表分别记录每个候选值的总操作次数和被生成的次数。
  4. 筛选最优解:遍历所有候选值,筛选出被所有元素生成的候选值,并找出总操作次数最小的那个。