题解
谁考了第k名
1 条题解
-
0
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