CCF 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的非负整数。

用 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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鳄鱼儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值