201503-2 数字排序

给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

输入格式

输入的第一行包含一个整数n,表示给定数字的个数。

第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。

输出格式

输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。

样例输入

12

5 2 3 3 1 3 4 2 5 2 3 5

样例输出

3 4

2 3

5 3

1 1

4 1

评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。

问题链接:CCF201503试题。

问题描述:

给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

这是一个统计排序的问题,先统计,后排序。一般用数组进行统计和排序,时空上难以获得完美。使用STL的包装类实现是一个好的选择。

map+优先队列

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
#include<iostream>
#include<map>
#include<queue>
using namespace std;
struct node{
int k,v;
node(int kk,int vv):k(kk),v(vv){
};
bool operator <(const node &p)const{
if(p.v>v) return true;
if(p.v==v) return p.k<k;
return false;
}
};

int main(){
int n,k;
map<int,int> dict;
int cnt=0;
cin>>n;
priority_queue<node> pq;
for(int i=0;i<n;i++)
{
cin>>k;
if(!dict.count(k)) dict[k]=1;
else dict[k]++;
}
for(map<int,int>::iterator it=dict.begin();it!=dict.end();it++)
{
pq.push(node(it->first,it->second));
}

while(!pq.empty()){
node t=pq.top();
pq.pop();
cout<<t.k<<" "<<t.v<<endl;
}

}