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生成所有可能的候选值,并记录每个候选值的操作次数。
- 统计操作次数和出现次数:使用两个哈希表分别记录每个候选值的总操作次数和被生成的次数。
- 筛选最优解:遍历所有候选值,筛选出被所有元素生成的候选值,并找出总操作次数最小的那个。



京公网安备 11010502036488号