递归分治--众数及重数

题目描述:

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

输入

输入集合大小n及n个数

输出

输出两行
第一行为众数
第二行为重数

样例输入

6
1 2 2 2 3 5

样例输出

2
3
#include <iostream>
#include<algorithm>
#include<vector>
#include<iterator>
using namespace std;
int num=0;
int sum=0;
int countZS(vector<int> &v,int s,int e){
  int n=v.at((s+e)/2);
  int counts=0;
  for(int i=s;i<e;i++){
    if(v[i]==n)
        counts++;
  }
  return counts;
}
int start(vector<int> &v,int s,int e){
  int x=0;
  for(int i=s;i<e;i++){
    if(v.at(i)==v.at((s+e)/2)){
        x=i;
        break;
    }
  }
  return x;
}
void mode(vector<int> &v,int s,int e){
     int  tnum=(s+e)/2;
     int  tsum=countZS(v,s,e);
     int left=start(v,s,e);
     if(tsum>sum){
        sum=tsum;
        num=v.at(tnum);
     }
    if((left+tsum)>sum)
              mode(v,left+tsum,e);
    if(left>sum)
         mode(v,s,left);
}

int main()
{
    int n;
    int m;
    vector<int> v;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>m;
        v.push_back(m);
    }
    sort(v.begin(),v.end());
    mode(v,0,n-1);
    cout<<num<<endl;
    cout<<sum;
    return 0;
}
发布了81 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41499217/article/details/102671842