思路:
- 找到列表中最小值,累加每个值(直到小于等于最小值)除以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")

京公网安备 11010502036488号