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的最后一个元素。
最后:写的博客比较随性,供自己学习巩固,也接受大家的批评和指正!