题目要求:有n个考场,每个考场有若干个考生,现给出各个考场中考生的准考证号与分数,按照分数从高到低排序,并按顺序输出所有考生的准考证号,排名,考场号以及所在的考场排名
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Student { char id[15]; int score; int location_number; int local_rank; }stu[30010]; bool cmp(Student a, Student b) { if (a.score != b.score) return a.score > b.score; else return strcmp(a.id, b.id) < 0; }//成绩高,学号靠前者优先 int main() { int n, k, num = 0;//num为总考生的人数,n为考场数,k为该考场内的人数。 scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", k); for (int j = 0; j < k; j++) { scanf("%s%d", stu[num], &stu[num].score); stu[num].location_number = i;//该学生的考场号为i num++; } sort(stu + num - k, stu + num, cmp);//将每一个考场的学生排序 stu[num - k].local_rank = 1; for (int j = num - k + 1; j < num; j++) {//num-k+1是该考场第2名学生,num代表到该考场为止的总人数。 if (stu[j].score == stu[j - 1].score) { stu[j].local_rank = stu[j - 1].local_rank; } else { stu[j].local_rank = j + 1 - (num - k);//因为local_rank 是本考场的排名所以应该再减去个num-k; } } } printf("%d\n", num);//输出考生总人数。 sort(stu, stu + num, cmp); int r = 1; for (int i = 0; i < num; i++) { if (i>0&&stu[i].score != stu[i - 1].score) { r = r + 1;//代表考生总排名 } printf("%s", stu[i].id); printf("%d %d %d\n", r, stu[i].location_number, stu[i].local_rank); } return 0; }