按成绩降序排序,取下标为 k-1 的学生并用 g 格式输出分数。
OJ: noi_openjudge
题目 ID: ch0110-01
难度:入门
标签:排序python
日期: 2026-07-30 23:01
题意
给出每位学生互不相同的成绩,输出成绩第 %g 的效果输出,不能固定小数位。
思路
把每位学生记成 (学号, 成绩),按成绩降序排列。Python 列表下标从 0 开始,因此第 rank - 1。
f"{score:g}" 与 C/C++ 的 %g 类似,会去掉不必要的小数末尾零。
代码
Python代码
python
student_count, rank = map(int, input().split())
students = []
for _ in range(student_count):
student_id, score = input().split()
students.append((student_id, float(score)))
# 成绩互不相同,按成绩从高到低排列后第 rank 个即为答案。
student_id, score = sorted(students, key=lambda student: student[1], reverse=True)[rank - 1]
print(student_id, f"{score:g}")C++代码
cpp
#include <cstdio>
char str[105][105];
int xh[105];
double fs[105];
int n,k;
int main(){
int i,j;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%s",str[i]);
xh[i] = i;
scanf("%lf",&fs[i]);
}
for(i=1;i<=n-1;i++)
for(j=1;j<=n-i;j++){
if( fs[j] > fs[j+1]){
double t = fs[j];
fs[j] = fs[j+1];
fs[j+1] = t;
int x = xh[j];
xh[j] = xh[j+1];
xh[j+1] = x;
}
}
int p = n-k+1;
printf("%s %g",str[xh[p]],fs[p]);
return 0;
}复杂度
排序时间复杂度为
总结
排序后直接按排名取元素。需要注意的是,名次从 1 开始而列表下标从 0 开始。