众数问题

众数问题

Time Limit: 2000 ms Memory Limit: 65536 KiB

Problem Description

给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n 个自然数组成的多重集S,计算S的众数及其重数。如果出现多个众数,请输出最小的那个。

Input

输入数据的第1行是多重集S中元素个数n(n<1300000);接下来的n行中,每行有一个最多含有5位数字的自然数,。

Output

输出数据的第1行给出众数,第2行是重数。

Sample Input

6
1
2
2
2
3
5

Sample Output

2
3

Hint

 

Source

分治解决

 当然 桶排序 解决这个问题,更简单;

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int maxNum,maxCount;
 4 vector<int> vt,leftMax,rightMax,Max;
 5 vector<int> fun(vector<int>&v ,int left,int right){
 6     vt.clear();
 7     if(left==right){vt.push_back(v[left]);vt.push_back(1);return vt;}//存进去 数据 ,个数为1 
 8     if(left>right) return vt;//越界 返回
 9     int mid=(left+right)/2;
10     leftMax=fun(v,left,mid);//求得左边的最大 值  {数据,个数}
11     rightMax=fun(v,mid+1,right);//右边的 最大值  {数据,个数}
12     int midCount=0,midNum=0;//中间的 最大值,和个数 初始为0
13     if(v[mid]==v[mid+1]){//计算中间的 值 和个数
14             midNum=v[mid];
15             for(int i=mid;i>=left;i--){//从中间往左  进行 统计
16                 if(v[i]==v[mid])   midCount++;
17                 else break;
18             }
19             for(int i=mid+1;i<=right;i++){//从中间往右进行 统计
20                 if(v[i]==v[mid]) midCount++;
21                 else break;
22             }
23     }//这三个 数据 依次 对 已更新的 最大值数据 和个数  进行比较 ,继续更新
24     if(leftMax[1]>maxCount){  maxNum=leftMax[0];  maxCount=leftMax[1];  }
25     if(rightMax[1]>maxCount){ maxNum=rightMax[0]; maxCount=rightMax[1]; }
26     if(midCount>maxCount){    maxNum=midNum;      maxCount=midCount;    }
27     Max.clear();//将结果 存到vector里面 Max[0] 存的数据 Max[1]存的 个数
28     Max.push_back(maxNum);
29     Max.push_back(maxCount);
30     return Max;//返回结果
31 
32 }
33 
34 int main()
35 {
36     int n,data;
37     vector<int> v;
38     cin>>n;
39     for(int i=0;i<n;i++) {cin>>data;v.push_back(data);}
40     sort(v.begin(),v.end());//对结果 进行排序
41     maxNum=0,maxCount=0;
42     Max=fun(v,0,v.size()-1);
43     cout<<Max[0]<<endl;
44     cout<<Max[1]<<endl;
45     return 0;
46 }
 
原文地址:https://www.cnblogs.com/NirobertEinteson/p/11929972.html