试题编号: | 201503-2 |
试题名称: | 数字排序 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 输入格式 输入的第一行包含一个整数n,表示给定数字的个数。 输出格式 输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。 样例输入 12 样例输出 3 4 评测用例规模与约定 1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。 |
解题思路:
这道题其实就只考察了一个结构体排序,懒惰的我不想用struct来自定义结构体 那直接用pair吧,pair的first是整数,second是该整数出现的次数。输入的时候用map来记录每个数字出现的次数,输入结束后将map中的所有元素都推入vector中进行排序。排序是根据自定义函数cmp来进行的,先按照出现次数的多少来降序排列,若出现次数相同则按照数字的权值大小来升序排列,最后for-each输出vector中的元素即可。
100分代码:
#include <bits/stdc++.h>
using namespace std;
#define Up(i,a,b) for(int i = a; i <= b; i++)
#define P pair<int,int> //pair的first为整数,second为该整数出现的次数
bool cmp(P a,P b)
{
if(a.second != b.second) //若出现次数不一样多
{
return a.second > b.second; //根据出现次数的多少来降序排列
}
else //若出现次数一样多
{
return a.first < b.first; //根据数字权值的大小来升序排列
}
}
int main()
{
int n;
cin >> n;
vector<P> v;
map<int,int> m;
Up(i,1,n)
{
int _;
cin >> _;
m[_]++;
}
for(auto it : m)
{
v.push_back({it.first,it.second});
}
sort(v.begin(),v.end(),cmp);
for(auto it : v)
{
cout << it.first << " " << it.second << endl;
}
return 0;
}