top1编程
← 返回题目
题解

谁考了第k名

1 条题解

  • 0
    @ 2026-8-5 23:03:52

    P4691 谁考了第k名(【入门】)

    解题思路

    把每个学生的学号和成绩装进一个结构体里,然后按成绩从高到低排序。排好之后,第 k 个学生就是要找的人,输出他的学号和成绩。

    成绩是浮点数,输出时要保留一位小数。这里有个细节:成绩要用 double 读入,输出用 fixed + setprecision(1)。比如输入 46.95,评测数据要求输出 47.0,用 double 才能得到这个结果,所以一定要和出题人的程序保持一致。

    打个比方:全班考完试,老师按分数从高到低排名,问你第 k 名是谁,排好序后直接数到第 k 个就行。

    参考代码

    // P4691 谁考了第k名:按成绩从高到低排序,输出第k名的学号和成绩
    #include <iostream>
    #include <algorithm>
    #include <iomanip>
    using namespace std;
    
    struct Stu {
        int id;     // 学号
        double sc;  // 成绩
    };
    
    bool cmp(const Stu &a, const Stu &b) {
        return a.sc > b.sc;   // 成绩高的排前面
    }
    
    int main() {
        int n, k;
        cin >> n >> k;
        Stu s[105];
        for (int i = 0; i < n; i++) cin >> s[i].id >> s[i].sc;
        sort(s, s + n, cmp);
        // 成绩保留一位小数输出
        cout << s[k - 1].id << " " << fixed << setprecision(1) << s[k - 1].sc << endl;
        return 0;
    }
    

    复杂度分析

    排序用 sort,时间复杂度 O(n log n)。n 最多 100,非常小。空间上存 n 个学生,是 O(n)。

    • 1