CCF201503-2 数字排序
题目:
题目分析:
题目要求统计一列数的重复数字个数,并按重复次数多少输出。
解题思路:
1.设计数据结构:
struct node{
int value,time;
}a[1010];
value:存储输入的数字,time存储该数字出现的次数,因为 1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数,所以输入时数组a[]的下标就是该数的值。
2.对数组a排序,排序规则:
int cmp(node i,node j){
if(i.time==j.time)return i.value<j.value;
else return i.time>j.time;
}
3.输出数组a[i]的value和对应的time,直到time=0。
代码如下,详细注解:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{ //设计结点类型
int value,time;
}a[1010];
int cmp(node i,node j){ //排序规则
if(i.time==j.time)return i.value<j.value; //次数相同,值小的优先
else return i.time>j.time; //其他情况,次数多的在前
}
int n,m,Max;
int main(){
cin>>n;
for(int i=0;i<n;i++){ //输入
cin>>m;
a[m].time++; //m对应的次数加1
a[m].value=m; //值为m
if(Max<m)Max=m; //Max记录最大的下标
}
sort(a,a+Max+1,cmp); //排序,注意:Max+1才是需要排序的长度
for(int i=0;i<n;i++){ //输出
if(a[i].time==0)break; //time=0,不再输出
cout<<a[i].value<<" "<<a[i].time<<endl;
}
return 0;
}