题目描述
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求排序后考第k名学生的学号和成绩。
输入格式
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的学号和成绩(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数不超过int范围)和一个成绩(浮点数),中间用一个空格分隔。
输出格式
输出第k名学生的学号和成绩,中间用空格分隔。
样例输入
5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9
样例输出
90788004 68.4
对于这道题,我们只需要统计出名次,用sum来计数,当sum==k时,就输出当前学号和成绩就可了了
首先定义一个结构体名叫stu
struct stu
{
int b;
double c;
};
再用排序(cmp1)
bool cmp1(const stu &x,const stu &y)
{
return x.c>y.c;
}
剩下的输入和sort
最主要的来了 第k名怎样知道 我们知道名次是从高到低的,这样就好办了
for(int i=1;i<=n;i++)
{
sum++;
if(sum==k)
{
cout<<a[i].b<<" "<<a[i].c;
break;
}
}
还有一种方法就是用了下表,直接用下表k输出即可
for(int i=1;i<=n;i++)
{
cin>>a[i].m>>a[i].s;
}
sort(a+1,a+n+1,cmp1);
cout<<a[k].m<<" "<<a[k].s;
这题也是十分的简单,以下就是正解,注意变量的定义
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int b;
double c;
};
bool cmp1(const stu &x,const stu &y)
{
return x.c>y.c;
}
stu a[105];
int main()
{
int n,k,s;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].b>>a[i].c;
}
sort(a+1,a+n+1,cmp1);
int sum=0;
for(int i=1;i<=n;i++)
{
sum++;
if(sum==k)
{
cout<<a[i].b<<" "<<a[i].c;
break;
}
}
return 0;
}