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