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