P7259 [COCI2009-2010#3] SORT 题解
题目
链接
https://www.luogu.com.cn/problem/P7259
字面描述
题目描述
Mirko 是一个伟大的密码破解者。他知道世界上任何密码都可以通过频率分析来破解。
但他完全弄错了什么是频率分析。
他截获了一个敌人的信息。这个信息由 N N N 个小于等于 C C C 的数字组成。
Mirko 相信频率分析包括对这个序列进行排序,使频率较高的数字出现在频率较低的数字之前。
给定任何两个数字 x x x 和 y y y,如果 x x x 在原始序列中出现的次数大于 y y y 出现的次数,则 x x x 出现在 y y y 之前。如果出现的次数相等,则输入中谁的值出现的早,谁就应该在排序后的序列中出现靠前。
请帮助 Mirko 制作一个「频率排序器」。
输入格式
第一行,两个正整数 N , C N, C N,C,含义见题目描述。
第二行, N N N 个正整数 a i a_i ai,表示消息。
输出格式
第一行, N N N 个正整数,表示排序后的序列。
样例 #1
样例输入 #1
5 2
2 1 2 1 2
样例输出 #1
2 2 2 1 1
样例 #2
样例输入 #2
9 3
1 3 3 3 2 2 2 1 1
样例输出 #2
1 1 1 3 3 3 2 2 2
样例 #3
样例输入 #3
9 77
11 33 11 77 54 11 25 25 33
样例输出 #3
11 11 11 33 33 25 25 77 54
提示
数据规模及约定
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 3 1 \le N \le 10^3 1≤N≤103, 1 ≤ C ≤ 1 0 9 1 \le C \le 10^9 1≤C≤109, 1 ≤ a i ≤ C 1\le a_i \le C 1≤ai≤C。
说明
翻译自 COCI 2009-2010 #3 T3 SORT,满分 70,每个测试点 7 分,共 10 个测试点。
思路
一道很水的结构体排序
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int n,m,x,op;
struct node{
int w,cnt,fa;// w记录数值,cnt记录数值出现的次数,fa记录数值最初出现的位置
}a[maxn];
inline bool cmp(node u,node v){
if(u.cnt!=v.cnt)return u.cnt>v.cnt;
return u.fa<v.fa;
}
int main(){
//freopen("B.in","r",stdin);
//freopen("B.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x);
bool flag=false;
for(int j=1;j<=op;j++){
if(a[j].w==x){
a[j].cnt++;
flag=true;
break;
}
}
if(!flag){
a[++op].w=x;
a[op].cnt=1;
a[op].fa=i;
}
}
sort(a+1,a+op+1,cmp);
for(int i=1;i<=op;i++){
while(a[i].cnt){
printf("%d ",a[i].w);
a[i].cnt--;
}
}
printf("\n");
return 0;
}