基数排序 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: 班级排名的主要内容,如果未能解决你的问题,请参考以下文章

❤️数据结构入门❤️(4 - 7)- 基数排序

后缀数组

基数排序与基数排序

基数排序:基数排序中的“组”是啥意思?

基数排序和更改基数

排序-基数排序