程序填空题:求解众数问题(分治法)
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n 个自然数组成的多重集S,计算S的众数及其重数。如果出现多个众数,请输出最小的那个。
```c++
#include
#include
#define N 1000
using namespace std;
int num;
int maxcnt=0;
void split(int a[],int low,int high,int &mid,int &left,int &right)
{
mid=(low+high)/2;
for(left=low;left<=high;left++)
if(a[left]==a[mid])
break;
for(right=left+1;right<=high;right++)
if(a[right]!=a[mid])
break;
right--;
}
void getmaxcnt(int a[],int low,int high)
{
if(low<=high)
{
int mid,left,right;
split(a,low,high,mid,left,right);
int cnt=right-left+1;
if(@@[cnt>maxcnt](2))
{
num=a[mid];
maxcnt=cnt;
}
else if(@@[cnt==maxcnt&&a[mid] {
num=a[mid];
}
@@[getmaxcnt(a,low,left-1)](2);
@@[getmaxcnt(a,right+1,high)](2);
}
}
int main()
{
int a[N],n;
cin>>n;
for(int i=0;i cin>>a[i];
sort(a,a+n);
getmaxcnt(a,0,n-1);
cout< return 0;
}
```
### 输入格式:
输入数据的第1行是多重集S中元素个数n(n<1000);第二行输入n个最多含有5位数字的自然数。
```in
14
1 2 2 2 3 3 5 6 6 5 6 2 7 6
```
### 输出格式:
输出数据的第1行给出众数,第2行是重数。
```out
2 4
```
答案:
第1空:cnt>maxcnt
第2空:cnt==maxcnt&&a[mid]
第3空:getmaxcnt(a,low,left-1)
第4空:getmaxcnt(a,right+1,high)
```c++
#include
#include
#define N 1000
using namespace std;
int num;
int maxcnt=0;
void split(int a[],int low,int high,int &mid,int &left,int &right)
{
mid=(low+high)/2;
for(left=low;left<=high;left++)
if(a[left]==a[mid])
break;
for(right=left+1;right<=high;right++)
if(a[right]!=a[mid])
break;
right--;
}
void getmaxcnt(int a[],int low,int high)
{
if(low<=high)
{
int mid,left,right;
split(a,low,high,mid,left,right);
int cnt=right-left+1;
if(@@[cnt>maxcnt](2))
{
num=a[mid];
maxcnt=cnt;
}
else if(@@[cnt==maxcnt&&a[mid]
num=a[mid];
}
@@[getmaxcnt(a,low,left-1)](2);
@@[getmaxcnt(a,right+1,high)](2);
}
}
int main()
{
int a[N],n;
cin>>n;
for(int i=0;i
sort(a,a+n);
getmaxcnt(a,0,n-1);
cout<
}
```
### 输入格式:
输入数据的第1行是多重集S中元素个数n(n<1000);第二行输入n个最多含有5位数字的自然数。
```in
14
1 2 2 2 3 3 5 6 6 5 6 2 7 6
```
### 输出格式:
输出数据的第1行给出众数,第2行是重数。
```out
2 4
```
答案:
第1空:cnt>maxcnt
第2空:cnt==maxcnt&&a[mid]
第3空:getmaxcnt(a,low,left-1)
第4空:getmaxcnt(a,right+1,high)