使用sort()函数进行排序时,输入的参数为排序开始的地址与结束地址的后一位以及(排序的方式)可以不加。
要algortthm头文件,并且using namespace std
实现C代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<algorithm>
using namespace std;
struct stu {
char id[100];
int score;
int local_number;
int local_rank;
int fin_rank;
}student[100];
bool cmp(stu a,stu b) {
if (a.score != b.score) {
return a.score > b.score;
}
else {
return strcmp(a.id , b.id)<0;
}
}
int main() {
int N, K;
int h = 0;
int num = 0;
int flag;
int fin = 1;
int count = 1;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &K);
for (int j = 0; j < K; j++) {
scanf("%s", &student[h].id);
scanf("%d", &student[h].score);
student[h].local_number = i+1;
h++;
num++;
}
flag = 1;
sort(student+h-K,student+h,cmp);
student[h - K].local_rank = 1;
for (int m = h - K+1; m < h; m++) {
if (student[m].score != student[m - 1].score) {
flag+=count;
student[m].local_rank = flag;
count = 1;
}
else {
count++;
student[m].local_rank = flag;
}
}
}
sort(student, student+h, cmp);
printf("%d\n", num);
student[0].fin_rank = fin;
printf("%s %d %d %d\n", student[0].id, student[0].fin_rank, student[0].local_number, student[0].local_rank);
for (int n = 1; n < h; n++) {
if (student[n].score != student[n - 1].score) {
fin+=count;
student[n].fin_rank = fin;
count = 1;
}
else {
count++;
student[n].fin_rank = fin;
}
printf("%s %d %d %d\n", student[n].id,student[n].fin_rank, student[n].local_number,student[n].local_rank);
}
return 0;
}
- 结构体定义变量时不要与定义名同一个名字。
- 在输入学号等一长串的数字时,使用字符串形式进行存储会更好,因为可能就算是长整型也难以存完所有位数导致溢出。
- 本代码使用count变量来充当同分数时的同排名以及之后分数多加的部分。