找最小最大金块问题(学习递归+分治思想)

题目:

有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。


#include<iostream>
using namespace std;

float w[100] = {0,1,2,3,4,5,6,7,8,9,10};
void gold(int low,int high,float* max,float* min)
{
	if(low == high)
	{
		*min = *max = w[low];
	}
	else if(high - low == 1)
	{
		*min = w[low] < w[high] ? w[low] : w[high];
		*max = w[high] > w[low] ? w[high] : w[low];
	}
	else
	{
		int mid;
		float x1,x2,y1,y2;

		mid = (low + high)/2;//(10+1)/2 = 5       
		//左半部分
		gold(low,mid,&x1,&y1);//(1)gold(1,5,&x1,&y1);==> 
													//(1+5)/2 = 3  (2)gold(1,3,&x1,&y1)  ==>
													//(1+3)/2 = 2  (3)gold(1,2,&x1,&y1)  ==> 
													//2-1 = 1 所以执行12行后比较大小 这时low = 1 high = 2 
													//比较w[1] w[2] 比较完后 变量x1 = w[1] x2 = w[2];
													//回到(2)执行gold(mid+1,high,&x2,&y2)即gold(3,3,&x2,&2)
													//这时x2 = y2 = w[3];
													//然后小的和小的比较   大的和大的比较 选出最小值和最大值
		//右半部分
		gold(mid+1,high,&x2,&y2);
		
		*max = x1>x2?x1:x2;
		*min = y1<y2?y1:y2;
	}
}
	int main()
	{
		float max,min;

		gold(1,10,&max,&min);  //从下标1开始找的
		cout<<max<<endl;
		cout<<min<<endl;
		return 0;
	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值