题目描述
有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。
本题要求用二分算法完成。
输入
输入数据有多行,第一行为金块个数n(n<=50000),接下来n行是n个金块的重量。
输出
输出最重的金块和最轻的金块,用空格隔开。
样例输入
8 10 8 2 4 5 3 9 1
样例输出
10 1
#include<iostream>
#include<algorithm>
using namespace std ;
const int N=5e5+5;
int a[N];
void maxmin(int a[],int &mx,int &mn,int l,int r);
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i] ;
int m1,m2;
maxmin(a,m1,m2,0,n); //半开区间[0,n)
cout << m1<<" "<<m2 << endl ;
return 0;
}
void maxmin(int a[],int &mx,int &mn,int l,int r){
int x1,y1,x2,y2,m;
if(r-l<=2) {
mx=max(a[l],a[r-1]);
mn=min(a[l],a[r-1]);
}
else{
m=(l+r)>>1;
maxmin(a,x1,y1,l,m);
maxmin(a,x2,y2,m,r);
mx=max(x1,x2);
mn=min(y1,y2);
}
}