金块问题
老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。
#include<iostream>
using namespace std;
int max1(int a,int b){//比较两个数大小
return (a>b?a:b);
}
int min1(int a,int b){//比较两个数大小
return (a<b?a:b);
}
int goldmax(int g[],int left,int right){
int gmax,lmax,rmax;
if(left==right){//只有一个数
gmax=g[left];
return gmax;
}
if(right-left==1){//有两个数,返回两个中较大的值
lmax=g[left];
rmax=g[right];
return (max1(lmax,rmax));
}
if(right-left>1){
int mid=(right+left)/2;
lmax=goldmax(g,0,mid);
rmax=goldmax(g,mid+1,right);
return (max1(lmax,rmax));
}
}
int goldmin(int g[],int left,int right){
int gmin,lmin,rmin;
if(left==right){//只有一个数
gmin=g[left];
return gmin;
}
if(right-left==1){//有两个数,返回两个中较小的值
lmin=g[left];
rmin=g[right];
return (min1(lmin,rmin));
}
if(right-left>1){
int mid=(right+left)/2;
lmin=goldmin(g,0,mid);
rmin=goldmin(g,mid+1,right);
return (min1(lmin,rmin));
}
}
int main(){
int gold[100],n;
cout<<"请输入金块的数量"<<endl;
cin>>n;
cout<<"请输入各个金块的重量"<<endl;
for(int i=0;i<n;i++){
cin>>gold[i];
}
cout<<"最重的金块是"<<goldmax(gold,0,n-1)<<"最轻的金块是"<<goldmin(gold,0,n-1)<<endl;
return 0;
}