题目描述
一个老板有一袋金币,里面有n个金子。每个月,老板会从袋子里拿出两个金块奖励两名表现优秀的雇员。按规矩,最优秀的雇员将得到最重的金块,排名第二的雇员将得到袋中最轻的金块。如果老板周期性地往袋子中加入新的金块,那么每个月他都要找出最重和最轻的金块。假设有一台比较质量的仪器,我们希望用尽量少的比较次数找出最重和最轻的金块。
输入
第1行只有1个整数n(2<=n<=100000).
第2行n个整型范围内的整数,每个整数之间用一个空格隔开,表示每块金子的质量。
输出
两个用空格分开的整数,表示最重和最轻的金块的质量。
样例输入
8
10 8 2 4 5 3 9 1
样例输出
10 1
算法:分治
想法:将n个数分成2段取最大值和最小值,再将两段的最大值与最小值比较筛选处最大值和最小值 。
代码实现
#include <bits/stdc++.h>
using
namespace
std;
int
a[100005];
int
getmax(
int
l,
int
r)
{
if
(l==r)
return
a[l];
int
mid=(l+r)/2;
int
mx1=getmax(l,mid);
int
mx2=getmax(mid+1,r);
return
max(mx1,mx2);
}
int
getmin(
int
l,
int
r)
{
if
(l==r)
return
a[l];
int
mid=(l+r)/2;
int
mn1=getmin(l,mid);
int
mn2=getmin(mid+1,r);
return
min(mn1,mn2);
}
int
main()
{
int
n;
cin>>n;
int
max;
for
(
int
i=1;i<=n;i++)
cin>>a[i];
cout<<getmax(1,n)<<
" "
<<getmin(1,n)<<endl;
return
0;
}