例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;
}
结果: