金块问题:老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。
分析:
当n=1时,最大最小都是一样,次数T(n)=0;
n=2时,直接比较两者的大小即可,次数T(n)=1;
当n>2时,把n分成两份,从两份中分别挑出最重的金子和最小的金子,然后第一份最小的金子和第二份最小的金子比较可以获得n块金子里最小的,把n分一直划分下去,次数T(n)=T(n/2)+2;
#include<iostream>
#include<cmath>
#include<algorithm>
#define m 100
using namespace std;
int getmax(int i,int j,int*a)
{
int mid,n1,n2,max;
if(i==j)
{
max=a[i];
}
else if(i==j-1)
{
if(a[i]>a[j])
{
max=a[i];
}
else
max=a[j];
}
else
{
mid=(i+j)/2;
n1=getmax(i,mid,a);
n2=getmax(mid+1,j,a);
if(n1>n2)
{
max=n1;
}
else
max=n2;
}
return max;
}
int getmin(int i,int j,int*a)
{
int mid,n1,n2,min;
if(i==j)
{
min=a[i];
}
else if(i==j-1)
{
if(a[i]<a[j])
{
min=a[i];
}
else
min=a[j];
}
else
{
mid=(i+j)/2;
n1=getmin(i,mid,a);
n2=getmin(mid+1,j,a);
if(n1<n2)
{
min=n1;
}
else
min=n2;
}
return min;
}
int main()
{
int n;
cin>>n;
int max,min;
int a[n];
int i;
for(i=0; i<n; i++)
{
cin>>a[i];
}
max=getmax(0,n-1,a);
cout<<max<<endl;
min=getmin(0,n-1,a);
cout<<min<<endl;
}