P7259 [COCI2009-2010#3] SORT
作者:互联网
题目描述
Mirko 是一个伟大的密码破解者。他知道世界上任何密码都可以通过频率分析来破解。
但他完全弄错了什么是频率分析。
他截获了一个敌人的信息。这个信息由 N 个小于等于 C 的数字组成。
Mirko 相信频率分析包括对这个序列进行排序,使频率较高的数字出现在频率较低的数字之前。
给定任何两个数字 x 和 y,如果 x 在原始序列中出现的次数大于 y 出现的次数,则 x 出现在 y 之前。如果出现的次数相等,则输入中谁的值出现的早,谁就应该在排序后的序列中出现靠前。
请帮助 Mirko 制作一个「频率排序器」。
输入格式
第一行,两个正整数 N, C,含义见题目描述。
第二行,N 个正整数 a_i,表示消息。
输出格式
第一行,N 个正整数,表示排序后的序列。
说明/提示
数据规模及约定
对于 100% 的数据,1≤N≤10^3,1≤C≤10^9,1≤ai≤C。
输入输出样例
输入 #15 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
分析:
给定任何两个数字 x 和 y,如果 x 在原始序列中出现的次数大于 y 出现的次数,则 x 出现在 y 之前。如果出现的次数相等,则输入中谁的值出现的早,谁就应该在排序后的序列中出现靠前。
本题可以使用sort和map函数,map函数把每个数字的出现次数和第一次出现位置关联起来,sort按照相应比较函数将原序列排序。
代码
#include <iostream> #include <map> #include <algorithm> using namespace std; map<int,int>counter,first; bool cmp(int a,int b) { if (counter[a] == counter[b]) return first[a] < first[b]; //出现次数相等,则比较谁先出现 return counter[a] > counter[b]; } int main() { int N,C,a[1005]; cin >> N >> C; for (int i = 1;i <= N;i++) { cin >> a[i]; counter[a[i]]++; //记录每个数字的出现次数 if (!first[a[i]]) first[a[i]]=i; //记录每个数字第一次出现的位置 } sort(a+1,a+N+1,cmp); for (int i = 1;i <= N;i++) { cout << a[i] << " "; } return 0; }
标签:SORT,11,COCI2009,int,P7259,counter,次数,出现,first 来源: https://www.cnblogs.com/branthx/p/16216476.html