老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。
折半。分治,递归。分别找最小值和最大值。仅供参考
#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int maxx=100019;
int a[maxx];
int cal_min(int a[],int l,int r)
{
if(r==l+1)
return min(a[l],a[r]);
else
{
int mid=(l+r)/2;
return min(cal_min(a,l,mid),cal_min(a,mid+1,r));
}
}
int cal_max(int a[],int l,int r)
{
if(r==l+1)
return max(a[l],a[r]);
else
{
int mid=(l+r)/2;
return max(cal_max(a,l,mid),cal_max(a,mid+1,r));
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("最小值: %d\n",cal_min(a,1,n));
printf("最大值: %d\n",cal_max(a,1,n));
return 0;
}
/*
8
10 3 6 1 4 8 2 30
*/