【模拟】【暴力】[COCI]排序

Mirko现在有 N个数,这些数都不大于C。他要按照这些数出现的频率来排序,使得出现频率较高的数排前面,如果两个数出现的频率相等,则先出现的排在前面。请你帮助他。
输入:第一行包含2个整数,N(1≤N≤1000),C(1≤C≤1000 000 000)。
接下来一行包含N个数,每个数不大于C。
输出:仅有一行,表示已经排好序的N个数。
输入样例1:
5 2
2 1 2 1 2

输出样例1:
2 2 2 1 1

输入样例2:
9 3
1 3 3 3 2 2 2 1 1
输出样例2:
1 1 1 3 3 3 2 2 2
输入样例3:
9 77
11 33 11 77 54 11 25 25 33
输出样例3:
11 11 11 33 33 25 25 77 54

就是首先离散化,然后模拟一下就好了

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 10000;
struct node{
    int times;
    int pos;
    int val;
}P[MAXN+10];
int _lower[MAXN+10], v[MAXN+10];
bool cmp(node a, node b){
    if(a.times == b.times)
        return a.pos < b.pos;
    return a.times > b.times;
}
int main()
{
    int n, C;
    scanf("%d%d", &n, &C);
    for(int i=1;i<=n;i++){
        scanf("%d", &v[i]);
        _lower[i] = v[i];
    }
    sort(_lower+1, _lower+1+n);
    int t = unique(_lower+1, _lower+1+n) - _lower - 1;
    for(int i=n;i>=1;i--){
        int id = lower_bound(_lower+1, _lower+1+t, v[i]) - _lower;
        P[id].times ++;
        P[id].pos = i;
    }
    for(int i=1;i<=t;i++)
        P[i].val = _lower[i];
    sort(P+1, P+1+t, cmp);
    for(int i=1;i<=t;i++){
        for(int j=1;j<P[i].times;j++)
            printf("%d ", P[i].val);
        if(i == t) printf("%d\n", P[i].val);
        else printf("%d ", P[i].val);
    }

    return 0;
}

你可能感兴趣的:(排序,算法,暴力搜索,coci)