B2158 谁考了第 k 名

· · 题解

欢迎报名洛谷网校,期待和大家一起进步!

本题考察结构体,排序。

我们用一个结构体 Stu 来存储每个学生的信息,包括学号 id(整数)和成绩 sc(浮点数):

struct Stu {
    int id;
    double sc;
}a[105];

这样,我们可以直接使用 a[i].ida[i].sc 来获取第 i 个学生的学号和成绩。

题目中,要求出第 k 名(也就是第 k 大)的学生学号以及成绩,因此我们需要进行“排序”操作。我们可以使用选择排序算法,每次找出 a_{i\dots n} 中最大的元素,把它和数组上第 i 个位置的元素交换。

参考代码:

for (int i = 1; i <= n - 1; ++i) {
    int best = i;
    for (int j = i + 1; j <= n; ++j) {
        if (a[j].sc > a[best].sc)
            best = j;
    }
    if (best != i) {
        Stu tmp = a[i];
        a[i] = a[best];
        a[best] = tmp;
        // 以上 3 行可以简化为 swap(a[i], a[best]),需要 algorithm 头文件。
    }
}