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