例14-2 [金块问题] 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
void fun(vector<int> &arr, int left, int right,int &max,int &min) {
//递归终止条件
if (left == right) max = min = arr[left];
else if (right == left + 1) {
max = arr[left] > arr[right] ? arr[left] : arr[right];
min = arr[left] < arr[right] ? arr[left] : arr[right];
}
else {
int x1, x2, y1, y2;
int mid = (left + right)/2;
fun(arr, left, mid, x1, y1);//左子树的最大值和最小值
fun(arr, mid + 1, right, x2, y2);//右子树的最大值和最小值
//父节点的最大值和最小值
max = x1 > x2 ? x1 : x2;
min = y1 < y2 ? y1 : y2;
}
}
int main() {
vector<int> v{ 2,43,5,24,67,3,77,98,100 };
int a = *max_element(v.begin(), v.end());
int b = *min_element(v.begin(), v.end());
cout << "truth: " << a << " " << b << endl;
int max = v[0], min = v[0];
fun(v, 0, v.size() - 1, max, min);
cout << "max: " << max << endl << "min: " << min << endl;
system("pause");
return 1;
}
结果:

本文探讨了一个经典的计算机科学问题——金块问题,通过递归算法在最少的比较次数中找出一组金块中最轻和最重的金块。文章提供了一个C++实现示例,展示了如何使用递归函数来解决此问题。
5334

被折叠的 条评论
为什么被折叠?



