给定含有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 output.txt
6 2
1 3
2
2
2
3
5
#include<bits/stdc++.h>
using namespace std;
int zhongshu=0;
int chongshu=0;
int a[100];
bool cmp(int x,int y)
{
return x<y;
}
void split(int a[],int left,int right)
{
if(left>right)return;
int lleft=left;//记录初始最左侧的序号
int rright=right;//记录初始最右侧的序号
int mid=(left+right)/2;
for(;left<mid&&a[left]!=a[mid];left++);//找到和a[mid]相等的最左侧的序号
for(;right>mid&&a[right]!=a[mid];right--);//找到和a[mid]相等的最右侧的序号
if(right-left+1>chongshu)
{
chongshu=right-left+1;
zhongshu=a[mid];
}
if(lleft-left>chongshu)//如果左侧的个数大于重数的话就对左侧数组继续进行操作
{
split(a,lleft,left-1);
}
if(rright-right>chongshu)
{
split(a,right+1,rright);
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n,cmp);
split(a,0,n-1);
cout<<zhongshu<<endl;
cout<<chongshu<<endl;
return 0;
}