基数排序 4016: 班级排名
Posted 每天的练习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序 4016: 班级排名相关的知识,希望对你有一定的参考价值。
题目要求将给出的成绩降序排序,将学号输出。
题目来源:
http://bailian.openjudge.cn/practice/4016/
4016: 班级排名
总时间限制: 1000ms 内存限制: 65536kB
描述
信息科学技术学院年终评定讲学金,需要对整个年级的学生按照平均分数进行排名.
要求:根据输入的学号和平均成绩,按照平均成绩降序输出学号
如果平均成绩相同,按照输入的顺序输出。
输入
第一行为N,表示输入N位学生的信息,接着的N行输入学生信息,1<=N<=500
学生信息的格式为:学号
学号的长度小于10,平均成绩在1-100之间.
输出
按照平均成绩降序输出学号,如果平均成绩相同,按照输入顺序输出
样例输入
5
10948001 80
10948004 90
10948101 95
10948102 80
10948209 90
样例输出
10948101
10948004
10948209
10948001
10948102
可以采用多种排序的方法,由于分数都是整数,仅有100个,这里使用基数排序的方法。主要的难点是对成绩相同情况的处理,可以把相同的成绩按输入顺序存储在同一个箱子中,如果采用一般数组,要额外存储一个数量。
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, i, j, score;
cin >> n;
string name[500], num;
int data[101][500] = { 0 };
for (i = 0; i < n; ++i) {
cin >> name[i] >> score;
data[score][0]++;
data[score][data[score][0]] = i;
}
for (i = 100; i > 0; --i) {
for (j = 0; j < data[i][0]; ++j) {
cout << name[data[i][j + 1]] << endl;
}
}
return 0;
}
代码长度:396B
内存:384kB
时间:6ms
通过率:93%
最小内存:128kB
最短时间:0ms
我采用了空间换时间的方式,当然在样本量较小的情况下还是比较浪费的,每一个箱子的第一个元素用来存储个数,之后依次存储学号对应的下标,在输出的时候判断第一个元素输出即可。
Github链接:点击下方的阅读原文
以上是关于基数排序 4016: 班级排名的主要内容,如果未能解决你的问题,请参考以下文章