问题描述
给定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的非负整数。
用 map 统计每个数出现的次数,map 实际会对每一个 key 值进行排序,但这不是我们需要的。
题目要求是按照 value 值从大到小进行排序并输出,这里使用 vector 作为转换,对 vector 进行排序,然后输出。
由于临近考试 CCF 判定系统崩了,暂时还没有分数结果
#include<bits/stdc++.h>
using namespace std;
map<int,int> num;
struct cmpByValue{
bool operator()(const pair<int,int>& l, const pair<int,int>& r) {
if(l.second != r.second) {
return l.second > r.second;
}
return l.first < r.first;
}
};
int main() {
int n,a;
cin >> n;
for(int i=0;i<n;i++) {
cin >> a;
num[a]++;
}
vector<pair<int,int> > ans(num.begin(),num.end());
sort(ans.begin(),ans.end(),cmpByValue());
for(int i=0;i!=ans.size();i++) {
cout << ans[i].first << " " <<ans[i].second <<endl;
}
return 0;
}
下面说下常规思路,用数组记录下数字出现的次数(下标为数字,元素为出现的次数)
再按照出现次数从大到小输出,最大出现次数为1000次,依次遍历找到元素出现次数刚好等于i
的数字,输出下标和元素。
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[1002];
int n,num;
int i,j;
memset(a,0,sizeof(int)*1002);
cin >> n;
for (i=0;i<n;i++){
cin >> num;
a[num]++;
}
for (i=1000;i>0;i--) {
for (j=0;j<1001;j++) {
if (a[j] == i) {
cout << j << " " << a[j] << endl;
break;
}
}
}
return 0;
}