思路:
- 找到列表中最小值,累加每个值(直到小于等于最小值)除以2 的次数,并且记录新的最小值
- 如果没有出现新的最小值,返回累加结果
- 否则递归调用函数,计算累加值
#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")