信息学奥赛一本通1176谁考了第K名:题解和思路
📚 题解:求第k名学生的学号和成绩
问题描述
在一次“智商测试”中,n名学生纷纷报名,每个人的成绩都不同。现在,你需要为这场“考试”找到第k名学生的学号和成绩。就像找人借钱一样,难度不大,但得认真对待哦!
输入格式
- 第一行:两个整数n(学生人数)和k(要求第k名)。
- 接下来的n行:每行包含一个学号和一个成绩,中间用空格分隔。别担心,他们的成绩不会被任何老师“随意修改”!
输出格式
- 输出第k名学生的学号和成绩,中间用空格分隔。成绩请用
%g
格式输出,保证你不会因为格式问题被扣分!
解题思路
- 数据结构:定义一个结构体
stu
,像把学生的信息装进一个“文件夹”。 - 输入:读取n和k,然后逐行读取学生的学号和成绩,存入数组中。
- 排序:用冒泡排序把学生按成绩从高到低排列,确保“高分学生”不会被埋没。
- 输出:拿出第k名学生,给他一个“光辉”的时刻!
代码实现
以下是完整的代码实现,保证一目了然:
#include <bits/stdc++.h>
using namespace std;
struct stu {
int xh; // 学号
double cj; // 成绩
} a[110]; // 存储学生信息的“档案夹”
int n, k;
int main() {
cin >> n >> k; // 输入学生人数和要求的名次
for (int i = 1; i <= n; i++)
cin >> a[i].xh >> a[i].cj; // 输入每个学生的学号和成绩
// 冒泡排序,像气泡一样,让高分浮到上面
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - 1; j++) {
if (a[j].cj < a[j + 1].cj) {
swap(a[j].xh, a[j + 1].xh);
swap(a[j].cj, a[j + 1].cj);
}
}
}
// 输出第k名学生的学号和成绩,让他“荣耀登场”
cout << a[k].xh << " " << std::fixed << std::setprecision(6) << a[k].cj;
return 0;
}
关键点解析
- 冒泡排序:虽然复杂度是O(n²),但在这个n最大为100的情况下,它依然是个好伙伴!只要不去找O(n log n)的伙伴就行。
- 输出格式:使用
std::fixed
和std::setprecision(6)
确保成绩以浮点数形式输出,避免因为格式问题而哭泣。
复杂度分析
- 时间复杂度:O(n²)(就像考试时的思考时间,复杂但重要)
- 空间复杂度:O(n)(存储学生信息的“档案夹”)
通过以上步骤,你将能成功找到第k名学生的学号和成绩,轻松应对这场“智商挑战”!🎉