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;
}