排序入門練習題3 誰考了第k名 題解


題目出處:《信息學奧賽一本通》第二章 上機練習1

題目描述

在一次考試中,每個學生的成績都不相同,現知道了每個學生的學號和成績,求考第k名的學生的學號和成績。

輸入格式

輸入的第一行包含兩個整數,分別是學生的人數 \(n(1 \le n \le 1000)\) ,和求第 \(k\) 名學生的 \(k(1 \le k \le n)\)
接下來 \(n\) 行,每行包含一個學號(整數)和一個成績(浮點數),中間用一個空格分隔。

輸出格式

輸出第 \(k\) 名學生的學號和成績,中間用空格分隔,成績請保留 \(2\) 位小數。

樣例輸入

5 3
9525 90.5
9526 100
9527 55.2
9528 60.13
9529 70.23

樣例輸出

9529 70.23

題目分析

首先我們需要開一個結構體來表示學生,並在定義的同時初始化一個結構體數組 a

struct Student {
    int id;         // id表示學號
    double point;   // point表示分數
} a[1001];

然后因為我們需要按照成績從高到低排序,所以我們需要寫一個比較函數用於按照成績從高到低排序:

bool cmp(Student a, Student b) {
    return a.point > b.point;
}

然后我們就可以使用 sort 函數對學生進行排序,並輸出第 \(k\) 名學生的信息了。
實現代碼如下:

#include <bits/stdc++.h>
using namespace std;
struct Student {
    int id;         // id表示學號
    double point;   // point表示分數
} a[1001];
int n, k;
bool cmp(Student a, Student b) {
    return a.point > b.point;
}
int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i ++) cin >> a[i].id >> a[i].point;
    sort(a, a+n, cmp);
    printf("%d %.2lf\n", a[k-1].id, a[k-1].point);
    return 0;
}

注意,因為我們程序中的數組 a 的坐標是從0開始的,所以它的第k好的學生的信息是保存在 a[k-1] 中的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM