ccf-csp 201503-2数字排序

ccf-csp 201503-2 数字排序

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

输入格式

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

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

数据范围
1≤n≤1000,
给出的数都是不超过 1000 的非负整数。

输入样例:

12

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

输出样例:

3 4

2 3

5 3

1 1

4 1

代码如下,后面有解释

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 1010;
int cnt[N];

bool cmp(int a,int b)
{
	return (cnt[a] > cnt[b]) ?  true : cnt[a] == cnt[b] ?  (a < b) : false;  
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 0 ; i < n ; i ++){
		int x;
		scanf("%d",&x);
		cnt[x]++;
	}
	vector<int> res;
	for(int i = 0 ; i <= 1000 ; i ++){
		if(cnt[i]) res.push_back(i);
	}
	sort(res.begin(),res.end(),cmp);
	int count = res.size();
	for(int i = 0 ; i < count ; i++) cout << res[i] <<' '<< cnt[res[i]]<<endl;
	//c++11中auto关键字,也可以这样写
	//for(auto x : res) cout << x << ' ' << cnt[x] << endl;
	return 0;
}

c++中sort 函数用法

sort ( start , end , 排序方法) 默认的是从小到大排序
//实现从大到小排序
bool cmp(int a,int b)
{
    return  a > b;
}

三目运算符

对于条件表达式b ? x : y;
先计算条件b,然后进行判断。
如果b的值为true,计算x的值,运算结果为x的值;
否则,计算y的值,运算结果为y的值。
//解释一下代码中的三目运算符
return (cnt[a] > cnt[b]) ?  true : cnt[a] == cnt[b] ?  (a < b) : false;
//先判断cnt[a]是否大于cnt[b]
//如果cnt[a] >cnt[b] ,则返回true 
//否则判断 cnt[a] == cnt[b]
//如果相等,按题意先返回小的那个值,否则返回false

c++ vector容器简介

声明
		#include <vector> 	头文件
		vector<int> a;		相当于一个长度动态变化的int数组
		vector<int> b[233];	相当于第一维长233,第二位长度动态变化的int数组
		struct rec{…};
		vector<rec> c;		自定义的结构体类型也可以保存在vector中

size/empty

       size函数返回vector的实际长度(包含的元素个数),
       empty函数返回一个bool类型,表明vector是否为空。
       二者的时间复杂度都是O(1)。
       所有的STL容器都支持这两个方法,含义也相同,之后我们就不再重复给出。

clear
		clear函数把vector清空。

迭代器
		迭代器就像STL容器的“指针”,可以用星号“*”操作符解除引用。
		一个保存int的vector的迭代器声明方法为:
		vector<int>::iterator it;

vector的迭代器是“随机访问迭代器”
可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。
可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。

begin/end
begin函数返回指向vector中第一个元素的迭代器。
例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。
所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n=a.size()。

下面两份代码都遍历了vector<int>a,并输出它的所有元素。
for (int I = 0; I < a.size(); I ++) cout << a[i] << endl;
for (vector<int>::iterator it = a.begin(); it != a.end(); it ++) cout << *it << endl;

front/back
		front函数返回vector的第一个元素,等价于*a.begin() 和 a[0]。
		back函数返回vector的最后一个元素,等价于*==a.end() 和 a[a.size() – 1]。

push_back() 和 pop_back()
        a.push_back(x) 把元素x插入到vector a的尾部。
		b.pop_back() 删除vector a的最后一个元素。

最后:写的博客比较随性,供自己学习巩固,也接受大家的批评和指正!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值