CCF-201503-2-数字排序

问题描述

试题编号: 201503-2
试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定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的非负整数。
解题思路:

按照桶排序的思想,开好多个结构体的桶,再按照结构体的关键字排序,外层从大到小,内层从小到大

因为sort没有确定好,结果得了一个70,索性改成最大才1005,不会超时的,得分100




源代码:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<deque>
#include<map>
#include<set>
#include<algorithm>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<cmath>
#include<sstream>
#include<ctime>
using namespace std;

typedef long long ll;

struct node
{
    int number;
    int cnt;
}ans[1005];

bool cmp(node a, node b)
{
    if(a.cnt>b.cnt)
        return 1;
    else if(a.cnt<b.cnt)
        return 0;
    else
    {
        if(a.number<b.number)
            return 1;
        else
            return 0;
    }
    return 0;
}

void init()
{
    for(int i=0;i<=1000;i++)
    {
        ans[i].number=i;
        ans[i].cnt=0;
    }
}
int main()
{
    int n;
    int num;
    init();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num);
        ans[num].cnt++;
    }
    sort(ans,ans+1005,cmp);
    for(int i=0;i<=1000;i++)
    {
        if(ans[i].cnt==0)
        {
            break;
        }
        else
        {
            printf("%d %d
",ans[i].number,ans[i].cnt);
        }
    }
	return 0;
}
</span>


原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776072.html