例题1:给n个实数,求它们之中最大值和最小值,要求比较次数尽量小。
思路:用递归调用函数,在函数里做出以下判断:
1 若left==right(只有一个数) max和min都为这个数
2 若left==right-1(只有两个数) max为较大的,min为较小的
3 除以上两种以外 首先定义中间值d,在递归调用left到d与d+1到right的函数,max为两函数返回值的最大值,min为最小值
核心思路如上
原代码:
#include <iostream>
using namespace std;
int a[132133],maxx,minn;
void qq(int left1,int right1,int &maxx,int &minn)
{
int d=0,max1=0,max2=0,min1=0,min2=0;
if(left1==right1){
maxx=a[left1];
minn=a[left1];
}
if(right1==left1+1){
maxx=max(a[left1],a[right1]);
minn=min(a[left1],a[right1]);
}
else{
d=(left1+right1)/2;
qq(left1,d,max1,min1);
qq(d+1,right1,max2,min2);
maxx=max(max1,max2);
minn=min(min1,min2);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
qq(1,n,maxx,minn);
cout<<maxx<<" "<<minn;
return 0;
}
错误原因:思路没错,但11行的if前面没有else,导致15行的else只建立在11行的if上,与思路不符,把if前面填个else即可