Description
给定n个数,在最坏情况下用╔ 3n/2-2 ╕次比较找出这n个数中元素的最大值和最小值。
要求只编写函数
void
maxmin(
int a[],int
low,
int
high,
int
*max,
int
*min).
系统会自动在程序的最后加上如下代码:
int main()
{
int max,min,k,a[200];
int m;
while(scanf("%d",&k)&&k)
{
memset(a,0,sizeof(a));
for(m=0;m<k;m++)
scanf("%d",&a[m]);
maxmin(a,0,k-1,&max,&min);
printf("%d %d\n",max,min);
}
}
Input
包含多组测试数据。每组测试数据的第一个元素是整数的个数n,接下来是n个整数。0表示结束。 n<=200
Output
这n个数中的最大值和最小值。
Sample Input
5 1 8 2 4 3 3 2 4 1 0
Sample Output
8 1 4 1
HINT
加上相应的头文件,并实现函数
思路:二分,先找左边的最大值和最小值,然后找右边最大最小值,最后两个最大值比较求最大,两个最小值比较求最小。
在做这个题的时候可能会遇到主函数中minn和maxx没有清0的问题,具体看代码(代码中有解释)。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<cmath>
#include<string>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
#define maxn 100010
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
void maxmin(int a[],int low,int hight,int *maxx,int *minn)
{
//cout<<low<<" "<<hight<<" "<<*maxx<<" "<<*minn<<endl;
if(low==hight)
{
*maxx=max(*maxx,a[low]);
*minn=min(a[low],*minn);
return ;
}
int mid=(low+hight)/2;
int maxx1=0,minn1=inf;//有这两步就不用在主函数中求最大值了
int maxx2=0,minn2=inf;
maxmin(a,low,mid,&maxx1,&minn1);
maxmin(a,mid+1,hight,&maxx2,&minn2);
*maxx=max(maxx1,maxx2);
*minn=min(minn1,minn2);
return ;
}
int main()
{
int max,min,k,a[200];
int m;
while(scanf("%d",&k)&&k)
{
//max=0,min=inf;
memset(a,0,sizeof(a));
for(m=0;m<k;m++)
scanf("%d",&a[m]);
maxmin(a,0,k-1,&max,&min);
printf("%d %d\n",max,min);
}
}