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;
}