问题描述
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
输入
第一行有两个整数,分别是学生的人数n(1≤n≤10000),和求第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
样例输入
1 1
90788001 67.888
样例输出
90788001 67.888
题目来源
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<bits/stdc++.h>
using namespace std;
bool cmp(double &a,double &b)
{
return a>b;
}
int main()
{
map<int,double> data;
int n,k;
cin>>n>>k;
double* a = new double[n];
for(int i=0;i<n;i++) //将学生学号和成绩录入map容器中
{
int std;
double score;
cin>>std>>score;
data[std] = score;
}
vector<double> v1;
for(auto it = data.begin();it!=data.end();it++)
{
v1.push_back(it->second); //将成绩放到vector容器中
}
sort(v1.begin(),v1.end(),cmp); //对分数进行从大到小的排序
double temp = *(v1.begin()+k-1); //得到第k名的学生的成绩
for(auto it = data.begin();it!=data.end();it++)
{
if(it->second==temp)
cout<<it->first<<" "<<it->second; //通过成绩在map容器中找到相应的学号
}
}
(新手发文,代码存在不足,仅供参考)