題目出處:《信息學奧賽一本通》第二章 上機練習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]
中的。