EOJ 2944 数组排序 个人错误分析
2994. 数组排序
单点时限: 2.0 sec
内存限制: 256 MB
给定一个长度为 N 的整数数组,按如下规则排序并输出。首先,输出重复出现次数最多的元素;出现次数相同时,按元素值由小到大输出。例如对于数组 1 2 3 3 4 2 3 1 5 7
排序后输出 3 3 3 1 1 2 2 4 5 7
。
输入格式
第 1 行:一个整数 T(1≤T≤10)为问题数。
对于每组测试数据:
第 1行是一个正整数:数组长度 N(1<N<2000);
第 2 行有 N 个整数:分别为第 1 至第 N个元素的值 a1,a2,⋯,an(∀i,0≤ai<500)。任意两个整数之间由一个空格分开。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等)。
然后在一行中输出排序后的数组元素,每两个整数之间由一个空格分开,最后一个整数后面没有空格。
样例
input
3 10 9 6 3 10 3 10 6 4 3 4 10 10 9 8 7 6 5 4 3 2 1 20 4 3 7 8 6 5 8 4 2 2 7 9 5 9 6 8 6 6 3 10
output
case #0: 3 3 3 4 4 6 6 10 10 9 case #1: 1 2 3 4 5 6 7 8 9 10 case #2: 6 6 6 6 8 8 8 2 2 3 3 4 4 5 5 7 7 9 9 10
------------------------------------------------------------------------------------------------------------------------------------
#include <iostream> #include <string.h> using namespace std; int main() { int t, i, temp; cin >> t; int a[501] = {0}; int n, p = 0; while (t--) { cin >> n; for (i = 0; i < n; i++) { cin >> temp; a[temp]++;//(按桶装数) } int cnt = 0; cout << "case #" << p++ << ":" << endl; while (cnt < n)//(用于快速退出循环) { int max = 0, maxid = 0; for (i = 0; i < 500; i++) { if (a[i] > max) { max = a[i];//最大次数 maxid = i;//记录数字 } } for (int j = 0; j < max; j++, cnt++)//同时积累次数 { cout << maxid; if (cnt != n - 1) cout << ' '; else cout << endl; } a[maxid] = -1; } for (i = 0; i < 501; i++) a[i] = 0; } return 0; } /*利用桶排序处理该问题,因为值取在500以内,不算很大,可以开500空间的数组,以角标记录数值,值记录次数(#故注意每次循环后将其清零#) 难点在于如何将这些记录了次数的容器取出并按次数排序,这里采用的是暴力破解的方法,利用一个循环操作找出次数最多的数字,记下id和次数,输出一次(这里同样记录cnt,达到n时方便直接 退出,减少时间),然后将这个最大值消掉(利用id赋值即可),然后再次循环找出次数第二多的,因为是利用了桶的特性,'出现次数相同时,按元素值由小到大输出',这条要求已经自动完成 比较轻松*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?