思路:

  1. 找到列表中最小值,累加每个值(直到小于等于最小值)除以2 的次数,并且记录新的最小值
  2. 如果没有出现新的最小值,返回累加结果
  3. 否则递归调用函数,计算累加值
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;

int find(std::vector<int>& vec, int min) {
    static int func_counter = 0;
    func_counter++;
    int counter = 0;
    int input_min = min;
    for (auto& num : vec) {
        // 对于大于min的元素,除以2直到其值小于等于min,并累加除以2的次数
        while (num > min) {
            num /= 2;
            counter++;
        }
        // 如果多次除以2之后,当前值小于当前的min,记录新的min(这说明除以2之后,还有元素不相等)
        if (num < input_min) {
            input_min = num;
        }
    }
    // 还有元素不相等,继续递归
    if (input_min < min) {
        counter += find(vec, input_min);
    }
    //递归结束
    return counter;
}

int main() {
    int n;
    cin >> n;
    std::vector<int> vec(n);
    int i = 0;
    int min = std::pow(10, 9);
    while (i < n) {
        cin >> vec[i];
        if (vec[i] < min) {
            min = vec[i];
        }
        i++;
    }

    std::cout << find(vec, min) << std::endl;


}
// 64 位输出请用 printf("%lld")