2 条题解
-
0
🎓【谁考了第k名】——题解 & C++代码
📝 题目描述(搞笑版)
某班有个学生,每个人的成绩都不一样(像考试时的座位表,没人敢作弊!)。现在给你一份“成绩黑名单”:每个学生的学号和成绩。你的任务很光荣——找出第k名学生的学号和成绩(注意:成绩要用%g输出,不然会扣分!)。
输入格式:
第一行:(学生人数,)和k(要找的第几名,)。 后面n行:每行一个学号(整数)和一个成绩(浮点数),用空格隔开。
输出格式:
第1行:第名学生的学号。 第2行:第名学生的成绩(用%g,不然老师会生气!)。
样例输入:
5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9
样例输出:
90788004 68.4
🤔 思路分析
这道题就像给全班同学排“成绩排行榜”,只不过不需要打印整个榜单,只需要找到第k名的“学霸”(或“学渣”?)不过题目说成绩不同,所以是最高的,是最低的)。
我们的策略很简单:把所有人的成绩存起来:用一个数组存成绩,另一个数组存对应的学号(毕竟学号和成绩是一一对应的,不能搞混!)。
给成绩排个序:按成绩从高到低排(因为第k名是按排名来的,第一名成绩最高,第二名次之……)。 直接拿结果:排序后,第k-1个位置(因为数组从开始数)就是你要找的第k名!
##🧠 具体步骤 读入数据:先读和,然后用两个数组(存学号,存成绩)把所有人的信息装进去。 排序成绩:用冒泡排序(简单易懂,虽然不是最快的,但才,足够快!)把成绩从高到低排。排序的时候,一定要把学号和成绩一起换位置,不然学号和成绩就
离婚了!(比如张三成绩90,李四成绩80,排序后如果只换成绩,张三的成绩跑到李四那里,学号却留在张三的位置,那就乱套了!)输出结果:排序后,第个位置的学号和成绩就是你要的答案。
🚀 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; }🎭 题解总结
这道题就像给全班同学排“”,你只需要: 把所有人的成绩“抓”进数组里; 用冒泡排序把它们“摞”成从高到低的顺序; 直接“揪”出第k个位置的“幸运儿”。 记住:学号和成绩要“绑定”在一起,不然你会把张三的成绩安到李四头上,老师会以为你在“调包”呢!😜
最后提醒:用完动态分配的数组,一定要!一定要一定要!!!,不然电脑会“记仇”的(内存泄漏)!💻
信息
- ID
- 36206
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- 递交数
- 50
- 已通过
- 17
- 上传者