题目:
给定含有
n
个元素的多重集合
S
,每个元素在
S
中出现的次数称为该元素的重数。多重
集
S
中重数最大的元素称为众数。
例如,
S={1
,
2
,
2
,
2
,
3
,
5}
。
多重集
S
的众数是
2
,其重数为
3
。
对于给定的由 n 个自然数组成的多重集 S,编程计算 S 的众数及其重数。
数据输入:
输入数据由文件名为
input.txt
的文本文件提供。
文件的第 1 行多重集
S
中元素个数
n
;接下来的 n 行中,每行有一个自然数。
结果输出:
程序运行结束时,将计算结果输出到文件 output.txt 中。输出文件有 2 行,第 1 行给
出众数,第 2 行是重数。
输入文件示例
input.txt
6
1
2
2
2
3
5
输出文件示例
output.txt
2
3
思路:
- 给数组进行排序
- 找出中位数v并且确定中位数的个数num和左右边界
- 如果左边界左边数字的个数比num大,说明众数可能在左边,重复步骤2
- 如果右边界右边数字的个数比num小,说明众数可能在右边,重复步骤2
代码在这里~:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void split(int a[],int n,int &l,int &r)
{
int mid=n/2;
for(l=n;l<n;l--)
{
if(a[l]==a[mid])
break;
}
for(r=l+1;r<n;r++)
{
if(a[r]!=a[mid])
break;
}
}
void findmax(int &maxn,int &m,int a[],int n)
{
int l,r;
split(a,n,l,r);
int mid=n/2;
int cnt=r-l;
if(cnt>m)
{
m=cnt;
maxn=a[mid];
}
if(l+1>m)
{
findmax(maxn,m,a,l+1);
}
if(n-r>m)
{
findmax(maxn,m,a+r,n-r);
}
}
int main()
{
ifstream fin("mode10.in",ios::in);
ofstream fout("answer10.txt");
int n;
int a[999999]={0};
fin>>n;
for(int i=0;i<n;i++)
fin >> a[i];
sort(a,a+n);
int m=0;
int maxn=0;
findmax(maxn,m,a,n);
fout << maxn << endl << m;
fout.close();
fin.close();
return 0;
}