排序⼊门练习题3谁考了第k名题解题⽬出处:《信息学奥赛⼀本通》第⼆章上机练习1
题⽬描述
在⼀次考试中,每个学⽣的成绩都不相同,现知道了每个学⽣的学号和成绩,求考第k名的学⽣的学号和成绩。输⼊格式
输⼊的第⼀⾏包含两个整数,分别是学⽣的⼈数n(1≤n≤1000) ,和求第k名学⽣的k(1≤k≤n) 。
接下来n⾏,每⾏包含⼀个学号(整数)和⼀个成绩(浮点数),中间⽤⼀个空格分隔。
输出格式html实现用户注册登录代码
输出第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]中的。Processing math: 100%