【问题描述】
编写一个程序,读入 N 个同学的姓名和语数外三门功课的单科成绩,对其按照一定的排序规则排序形成一张成绩表(先按总分从高到低排序,总分相同则按语文成绩由高到低排序,仍然相同则按数学成绩由高到低排序,若总分和单科成绩均相同则最后按姓名的字典序排序)。最后给定一个数字 K(K<=N) ,输出在这张排好序的成绩表中位置在第 K 位的同学的姓名和总分。
字典序举例说明:
abc > abd
a > aa
【输入形式】
第一行输入一个正整数 N(1<=N<=1024),代表接下来将录入 N 个学生的成绩。
接下来 N 行录入 N 条学生的成绩记录,每条记录依次为姓名,语文成绩,数学成绩,英语成绩,这四个字段以空格分隔。姓名为字符串(仅包含小写字母,不含空格,长度<=19),学生之间不会重名。三科成绩均为整数(0~100)。
最后输入一个正整数 K(1<=K<=N),代表需要在成绩表中从前往后找到的位置。
【输出形式】
在成绩表中从前往后处在第 K 位的同学的姓名和总分,中间以空格分隔。
【样例输入1】
2
tom 90 91 92
lucy 91 90 92
1
【样例输出1】
lucy 273
【样例输入2】
4
lily 90 100 88
jack 87 79 95
hanz 90 89 71
david 90 89 71
4
【样例输出2】
hanz 250
【具体代码实现】
#include<iostream>
#include<string>
#include<algorithm> //可以直接利用STL中的sort() 是结合了快速排序与插入排序的一种排序
using namespace std;
class Students
{
public:
string student_name;
float chinese;
float math;
float english;
float sum;
};
bool cmp(const Students& a,const Students& b)
{
if (a.sum>b.sum)
return true;
else if (a.chinese>b.chinese && a.sum==b.sum)
return true;
else if (a.math>b.math && a.chinese==b.chinese && a.sum==b.sum)
return true;
else if (a.english>b.english && a.math==b.math && a.chinese==b.chinese && a.sum==b.sum)
return true;
else if ( a.student_name <b.student_name && a.english==b.english && a.math==b.math && a.chinese==b.chinese && a.sum==b.sum)
return true;
else
return false;
}
int main()
{
int N=1025;
Students students[N];
int K;
int n;
cin>>n;
for (int i=0; i<n; i++)
{
cin>>students[i].student_name;
cin>>students[i].chinese;
cin>>students[i].math;
cin>>students[i].english;
students[i].sum=students[i].math+students[i].english+students[i].chinese;
}
sort(students,students+n,cmp);
cin>>K;
cout<<students[K-1].student_name<<" "<<students[K-1].sum;
return 0;
}