程序填空题:最大次大问题(分治法)
用分治法查找序列中最大值和次大值。
```c++
#include
#include
#define N 1000
#define INF -32768
using namespace std;
void max1max2(int a[],int low,int high,int &max1,int &max2)
{
if (low==high)
{ max1=a[low]; max2=INF;}
else if (low==high-1)
{
max1=;
max2=;
}
else
{ int mid=(low+high)/2;
int lmax1,lmax2;
;
int rmax1,rmax2;
;
if (lmax1>rmax1)
{ max1=lmax1;
max2=max(lmax2,rmax1);
}
else
{ max1=rmax1;
max2=max(lmax1,rmax2);
}
}
}
int main()
{
int A[N],i,max1,max2,n;
cin>>n;
for(i=0;i cin>>A[i];
;
cout< return 0;
}
```
### 输入格式:
第一行输入整数个数n,再依次输入n个整数。
```in
12
19 14 23 1 68 20 84 27 55 11 10 79
```
### 输出格式:
输出最大值和次大值。
```out
84 79
```
答案:
第1空:max(a[low],a[high])
第2空:min(a[low],a[high])
第3空:max1max2(a,low,mid,lmax1,lmax2)
第4空:max1max2(a,mid+1,high,rmax1,rmax2)
第5空:max1max2(A,0,n-1,max1,max2)
```c++
#include
#include
#define N 1000
#define INF -32768
using namespace std;
void max1max2(int a[],int low,int high,int &max1,int &max2)
{
if (low==high)
{ max1=a[low]; max2=INF;}
else if (low==high-1)
{
max1=;
max2=;
}
else
{ int mid=(low+high)/2;
int lmax1,lmax2;
;
int rmax1,rmax2;
;
if (lmax1>rmax1)
{ max1=lmax1;
max2=max(lmax2,rmax1);
}
else
{ max1=rmax1;
max2=max(lmax1,rmax2);
}
}
}
int main()
{
int A[N],i,max1,max2,n;
cin>>n;
for(i=0;i
;
cout<
}
```
### 输入格式:
第一行输入整数个数n,再依次输入n个整数。
```in
12
19 14 23 1 68 20 84 27 55 11 10 79
```
### 输出格式:
输出最大值和次大值。
```out
84 79
```
答案:
第1空:max(a[low],a[high])
第2空:min(a[low],a[high])
第3空:max1max2(a,low,mid,lmax1,lmax2)
第4空:max1max2(a,mid+1,high,rmax1,rmax2)
第5空:max1max2(A,0,n-1,max1,max2)