给定n个考场中所有考生的姓名、分数,输出这些考生的考场内排名。
注:
- 排名 = 高于当前分数的考生个数 + 1
- 分数相同时排名相同
按考生姓名的字典序从小到大输出,每行为一个考生的姓名、分数、考场内排名,用空格隔开。
思路:可以很巧妙地构思:因为每次是输入的同一个考场的学生信息,因此可以用一个数组去存所有学生,每次录入完一个考场后的学生,对这些学生当即进行成绩排序。最后再对总的学生的姓名进行排序。
代码如下:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct Student{
string name;
int grade;
int rank;
};
bool cmp1(Student s1,Student s2){
return s1.grade>s2.grade;
}
bool cmp2(Student s1,Student s2){
return s1.name<s2.name;
}
int main(){
int n;
cin>>n;
int count = 0;
Student stu[1000];
for(int i=0;i<n;i++){
int j;
cin>>j;
for(int u=0;u<j;u++){
cin>>stu[u+count].name>>stu[u+count].grade;
}
sort(stu+count,stu+count+j,cmp1);
stu[count].rank = 1;
for(int u=count+1;u<j+count;u++){
if (stu[u].grade == stu[u - 1].grade) {
stu[u].rank = stu[u - 1].rank;
} else {
stu[u].rank = u - count + 1;
}
}
count+=j;
}
sort(stu,stu+count,cmp2);
for(int i=0;i<count;i++){
cout<<stu[i].name<<" "<<stu[i].grade<<" "<<stu[i].rank<<endl;
}
return 0;
}