ZZULIOJ:1201: 众数问题

 

1201: 众数问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 2504  解决: 1635
[状态] [讨论版] [提交] [命题人:外部导入]

题目描述

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

输入

第1行多重集S中元素个数n(n<=50000);接下来的n 行中,每行有一个自然数。

输出

输出文件有2 行,第1 行给出众数,第2 行是重数。(如果有多个众数,只输出最小的)

样例输入 Copy

6
1
2
2
2
3
5

样例输出 Copy

2
3

来源/分类

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct most {
    int num, fre;
}M;
M m[50001];
int max_ = -1;
static int flag = 0;
void quicksort(int l, int r) {//快排,顺便找最大值
    int p = l;
    if (l < r) {
        int index = p + 1;
        for (int i = index; i <= r; i++) {
            if(flag == 0) //在第一次调用找最大值,防止浪费时间
                max_ = max(max_, m[i].fre);
            if (m[i].num < m[p].num) {
                M t = m[i];
                m[i] = m[index];
                m[index] = t;
                index++;
            }
        }
        M t = m[p];
        m[p] = m[index - 1];
        m[index - 1] = t;
        flag++;
        quicksort(l, p - 1);
        quicksort(p + 1, r);
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    int low, t, sum = 0;
    for (int i = 0; i < n; i++) {//存
        t = 0;
        cin >> low;
        for (int j = 0; j < sum; j++) {
            if (m[j].num == low) {
                m[j].fre++;
                t = 1;
                break;
            }
        }
        if (t == 0) { 
            m[sum].num = low;
            m[sum].fre++;
            sum++;
        }
    }
    quicksort(0, sum - 1);//排序
    for (int i = 0; i < sum; i++) {
        if (m[i].fre == max_) {//如果找到了最大值,证明找到了那个数
            cout << m[i].num << '\n' << m[i].fre;
            break;
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿白|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值