问题描述(OJ链接)
给定 n n n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数 n n n,表示给定数字的个数。
第二行包含 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 1 ≤ n ≤ 1000 1≤n≤1000,给出的数都是不超过1000的非负整数。
题解
思路
本题仅需用一个辅助数据结构Tmp
记录每1个数字的值(value
)及其出现的次数(cnt
),然后重载运算符<
并针对cnt
排序输出即可。辅助数据结构Tmp
定义如下:
struct Tmp {
int value;
int cnt;
bool operator<(const Tmp &t) const {
if (this->cnt != t.cnt)
return this->cnt < t.cnt;
return this->value > t.value;
}
} result[1005];
其余见AC代码。
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[1005] = {0};
int n;
struct Tmp {
int value;
int cnt;
bool operator<(const Tmp &t) const {
if (this->cnt != t.cnt)
return this->cnt < t.cnt;
return this->value > t.value;
}
} result[1005];
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int idx;
cin >> idx;
a[idx]++;
}
int curIdx = 0;
for (int i = 0; i <= 1000; i++) {
if (a[i] != 0) {
result[curIdx].value = i;
result[curIdx].cnt = a[i];
curIdx++;
}
}
sort(result, result + curIdx);
for (int i = curIdx - 1; i >= 0; --i) {
cout << result[i].value << " " << result[i].cnt << endl;
}
return 0;
}