原始题目
2179: 找众数
Time Limit: 1 Sec
Memory Limit: 128 Mb
Submitted: 86
Solved: 32
Description
由文件给出\(N\) 个\(1\) 到\(30000\) 间无序数正整数,其中\(1≤N≤10000\) ,同一个正整数可能会出现多次,出现次数最多的整数称为众数。求出它的众数及它出现的次数。 ### Input 输入文件第一行是正整数的个数\(N\) ,第二行开始为\(N\) 个正整数。
Output
输出文件有若干行,每行两个数,第一个是众数,第二个是众数出现的次数。
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; } } }
收获与反思
出题者没说清楚,应该加个特判的,所以注意排序以字典序为第二关键字。