2 条题解

  • 0
    @ 2025-8-30 13:50:48

    🎓【谁考了第k名】——题解 & C++代码

    📝 题目描述(搞笑版)

    某班有nn个学生,每个人的成绩都不一样(像考试时的座位表,没人敢作弊!)。现在给你一份“成绩黑名单”:每个学生的学号和成绩。你的任务很光荣——找出第k名学生的学号和成绩(注意:成绩要用%g输出,不然会扣分!)。

    输入格式:

    第一行:nn(学生人数,1n1001≤n≤100)和k(要找的第几名,1kn1≤k≤n)。 后面n行:每行一个学号(整数)和一个成绩(浮点数),用空格隔开。

    输出格式:

    第1行:第kk名学生的学号。 第2行:第kk名学生的成绩(用%g,不然老师会生气!)。

    样例输入:

    5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9

    样例输出:

    90788004 68.4

    🤔 思路分析

    这道题就像给全班同学排“成绩排行榜”,只不过不需要打印整个榜单,只需要找到第k名的“学霸”(或“学渣”?)不过题目说成绩不同,所以k=1k=1是最高的,k=nk=n是最低的)。

    我们的策略很简单:把所有人的成绩存起来:用一个数组存成绩,另一个数组存对应的学号(毕竟学号和成绩是一一对应的,不能搞混!)。

    给成绩排个序:按成绩从高到低排(因为第k名是按排名来的,第一名成绩最高,第二名次之……)。 直接拿结果:排序后,第k-1个位置(因为数组从00开始数)就是你要找的第k名!

    ##🧠 具体步骤 读入数据:先读nnkk,然后用两个数组(idsids存学号,scoresscores存成绩)把所有人的信息装进去。 排序成绩:用冒泡排序(简单易懂,虽然不是最快的,但nn100100,足够快!)把成绩从高到低排。排序的时候,一定要把学号和成绩一起换位置,不然学号和成绩就离婚了!(比如张三成绩90,李四成绩80,排序后如果只换成绩,张三的成绩跑到李四那里,学号却留在张三的位置,那就乱套了!)

    输出结果:排序后,第k1k-1个位置的学号和成绩就是你要的答案。

    🚀 C++代码

    #include <iostream>
    using namespace std;
    int main() {
        int n, k;
        cin >> n >> k;  // 读入学生人数n和要找的第k名
        int* ids = new int[n];      // 动态分配数组存学号
        double* scores = new double[n];  // 动态分配数组存成绩
        // 读入每个学生的学号和成绩
        for (int i = 0; i < n; i++) {
            cin >> ids[i] >> scores[i];
        }
        // 冒泡排序:按成绩从高到低排(同时交换学号,保持对应关系)
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                // 如果后面的成绩比前面高,就交换
                if (scores[j] < scores[j + 1]) {
                    // 交换成绩
                    double temp_score = scores[j];
                    scores[j] = scores[j + 1];
                    scores[j + 1] = temp_score;
                    // 交换学号(必须一起换,不然学号和成绩就对不上了!)
                    int temp_id = ids[j];
                    ids[j] = ids[j + 1];
                    ids[j + 1] = temp_id;
                }
            }
        }
        // 输出第k名学生的学号和成绩(注意:k=1对应数组下标0,所以用k-1)
        cout << ids[k - 1] << endl;
        cout << scores[k - 1] << endl;
        // 释放动态分配的内存(很重要!不然会有内存泄漏)
        delete[] ids;
        delete[] scores;
        return 0;
    }
    

    🎭 题解总结

    这道题就像给全班同学排“成绩ladder成绩 ladder”,你只需要: 把所有人的成绩“抓”进数组里; 用冒泡排序把它们“摞”成从高到低的顺序; 直接“揪”出第k个位置的“幸运儿”。 记住:学号和成绩要“绑定”在一起,不然你会把张三的成绩安到李四头上,老师会以为你在“调包”呢!😜

    最后提醒:用完动态分配的数组,一定要delete[]delete[ ]!一定要delete[]!!delete[ ]!!一定要delete[]delete[ ]!!!,不然电脑会“记仇”的(内存泄漏)!💻

    信息

    ID
    36206
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    50
    已通过
    17
    上传者