【CSU-2179】解题报告(水题)

原始题目

2179: 找众数

  • Time Limit: 1 Sec
  • Memory Limit: 128 Mb
  • Submitted: 86
  • Solved: 32

Description

由文件给出\(N\)\(1\)\(30000\)间无序数正整数,其中\(1≤N≤10000\),同一个正整数可能会出现多次,出现次数最多的整数称为众数。求出它的众数及它出现的次数。 ### Input 输入文件第一行是正整数的个数\(N\),第二行开始为\(N\)个正整数。

Output

输出文件有若干行,每行两个数,第一个是众数,第二个是众数出现的次数。

Sample Input

12
2  4  2  3  2  5  3  7  2  3  4  3

Sample Output

2 4
3 4

Hint

Source

题目大意

如题

解题思路

记录出现次数,加入动态数组中按次数大小快速排序,最后输出(众数多个注意排序的时候按字典序)。

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <cstdio>
#include<cstring>
#include<iostream>
#include<set>
#include <queue>
#include<vector>
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int maxm=1e5+5;


typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int > pii;
typedef pair<string,string> pss;


#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define fi first
#define se second
#define pb push_back
#define np next_permutation
#define mp make_pair
#define all(x) x.begin(),x.end()
int n;
int a[maxn];
int ans1=0,ans2=0;
vi ans;

bool cmp(int c,int d){
if(a[c]==a[d]) return c<d;
else return a[c]>a[d];
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n){
memset(a,0,sizeof(a));
ans.clear();
rep(i,0,n){
int temp;
cin>>temp;
if(!a[temp]) ans.pb(temp);
a[temp]++;

}
sort(all(ans),cmp);
int len=ans.size();
cout<<ans[0]<<" "<<a[ans[0]]<<endl;
for(int i=1;i<len;i++){
if(a[ans[i]]<a[ans[0]]) break;
cout<<ans[i]<<" "<<a[ans[0]]<<endl;
}

}

}

收获与反思

出题者没说清楚,应该加个特判的,所以注意排序以字典序为第二关键字。