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

思路:定义一个结构体来包装数据及其计数值,并重写operator<方法,按计数值大小排序,计数值相同的话按序号排序。

 

 

#include<iostream>
#include<map>
#include<algorithm>

const int MAX_VALUE = 1001;
using namespace std;
typedef struct Nums {
    int num;
    int count;
    bool operator <(const Nums &_A)const {
        if (count > _A.count) //按计数值从大到小排序 
            return true;
        if (count == _A.count)//计数值相同的情况下按编号从小到大排序
            return num < _A.num;
        return false;
    }
}Numsinfo,*PNumsinfo;

int main17() {
    int n;//输入数字的个数
    cin >> n;
    Numsinfo nums[MAX_VALUE];
    for (int i = 0; i < MAX_VALUE; i++) {//初始化,对序号赋值
        nums[i].num = i;
        nums[i].count = 0;
    }
    int x;//输入的数据,输入一个数据,将其对应的序号的计数值加一
    for (int i = 0; i < n; i++) {
        cin >> x;
        nums[x].count++;
    }
    sort(nums, nums + MAX_VALUE);//对数组排序,排序方法即为上面重写的operator<方法,遇到没有出现过的就结束本次循环
    for (int i = 0; i < n; i++) {
        if (nums[i].count == 0) break;
        cout << nums[i].num << " " << nums[i].count << endl;
    }
    system("pause");
    return 0;
}

 

posted @ 2020-02-07 21:58  做个读书人  阅读(156)  评论(0编辑  收藏  举报