信息学奥赛一本通1176谁考了第K名:题解和思路

📚 题解:求第k名学生的学号和成绩

原题

问题描述

在一次“智商测试”中,n名学生纷纷报名,每个人的成绩都不同。现在,你需要为这场“考试”找到第k名学生的学号和成绩。就像找人借钱一样,难度不大,但得认真对待哦!

输入格式

  • 第一行:两个整数n(学生人数)和k(要求第k名)。
  • 接下来的n行:每行包含一个学号和一个成绩,中间用空格分隔。别担心,他们的成绩不会被任何老师“随意修改”!

输出格式

  • 输出第k名学生的学号和成绩,中间用空格分隔。成绩请用%g格式输出,保证你不会因为格式问题被扣分!

解题思路

  1. 数据结构:定义一个结构体stu,像把学生的信息装进一个“文件夹”。
  2. 输入:读取n和k,然后逐行读取学生的学号和成绩,存入数组中。
  3. 排序:用冒泡排序把学生按成绩从高到低排列,确保“高分学生”不会被埋没。
  4. 输出:拿出第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;
}

关键点解析

  1. 冒泡排序:虽然复杂度是O(n²),但在这个n最大为100的情况下,它依然是个好伙伴!只要不去找O(n log n)的伙伴就行。
  2. 输出格式:使用std::fixedstd::setprecision(6)确保成绩以浮点数形式输出,避免因为格式问题而哭泣。

复杂度分析

  • 时间复杂度:O(n²)(就像考试时的思考时间,复杂但重要)
  • 空间复杂度:O(n)(存储学生信息的“档案夹”)

通过以上步骤,你将能成功找到第k名学生的学号和成绩,轻松应对这场“智商挑战”!🎉