【分治算法】-1.金块问题:递归和分治策略

例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;
}

结果:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值