01:谁考了第k名

总时间限制: 1000ms 内存限制: 65536kB
描述
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。

输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
样例输出
90788004 68.4
解析
这里使用直接插入排序,按成绩从高到低进行。为了完成成绩与学号的对应,设置学生结构体,包含学号和成绩,按成绩对学生进行排序,排序后输出即可。
奇怪的是,这题我用过快速排序,反而超时(可能是给的数据已经是有序的了)

#include<iostream>
#include<string>
using namespace std;
//设置学生的结构体,里面包含学生的学号和成绩 
typedef struct student{
	string NO;
	float score;
};
//直接插入排序
void InsertSort(student a[],int n){
	int i,j;
	for(int i=2;i<=n;i++){
//按成绩由高到低进行排序
		if(a[i].score>a[i-1].score){
			a[0]=a[i];
			for(j=i-1;a[0].score>a[j].score;j--){
				a[j+1]=a[j];
			}
			a[j+1]=a[0];
		}
	}
}
int main(){
	//01
	
	int n,k;
	cin>>n>>k;
	//输入学生的学号和成绩 
	student stu[n+5];
	for(int i=1;i<=n;i++){
		cin>>stu[i].NO>>stu[i].score;
	}
	
	InsertSort(stu,n);
	//输出从高到低第k名同学的学号和成绩 
	cout<<stu[k].NO<<' '<<stu[k].score;
	
	
	//01
	
	return 0;
}
发布了36 篇原创文章 · 获赞 0 · 访问量 336

猜你喜欢

转载自blog.csdn.net/weixin_44437496/article/details/104052495