• 众数问题


    众数问题

    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 }
     
  • 相关阅读:
    js 冒泡排序 与非冒泡排序
    js Base64加密与解密
    复杂的时间调度器
    js计算阶乘与斐波切纳数列
    js按需加载兼容性写法
    关于JavaScript的宏任务与微任务
    caller与callee的区别
    如何实现一个parseInt
    nodejs 保存 payload 发送过来的文件
    angularjs:[1] ui-router 权限控制
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11929972.html
Copyright © 2020-2023  润新知