题目描述:
给定n个考生的姓名、分数,将这些考生按分数从高到低进行排序,分数相同时按姓名的字典序从小到大进行排序,输出排序后的结果。
输入描述:
第一行一个整数n(1≤n≤1000),表示考生个数;
接下来n行,每行为一个考生的姓名name和分数score(name为仅由大小写字母组成的不超过15个字符的字符串,0≤score≤100),用空格隔开。数据确保不会出现相同的姓名。
输出描述:
输出排序后的结果,共n行,每行为一个考生的姓名和分数,用空格隔开,最后一项输出后不允许有多余的空格和换行符。
样例1:
输入:
5
SunWuKong 92
ShaWuJing 90
TangSanZang 100
BaiLongMa 90
ZhuBaJie 87
输出:
TangSanZang 100
SunWuKong 92
BaiLongMa 90
ShaWuJing 90
ZhuBaJie 87
解题思路:
其实没什么思路可说,就是简单的排序问题:
① 创建结构体变量存储学生信息
② 调用C语言qsort()函数或C++sort()进行比较
③ 自定义回调函数的比较方式。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char name[20];
int score;
}Student;
// 先比较分数,分数相同对名字进行字典排序
int cmp(const void* a, const void* b){
if((*(Student*)a).score != (*(Student*)b).score) return (*(Student*)b).score - (*(Student*)a).score;
else return strcmp((*(Student*)a).name, (*(Student*)b).name);
}
int main(){
int n;
Student stu[1000];
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%s %d", stu[i].name, &stu[i].score);
}
qsort(stu, n, sizeof(stu[0]), cmp);
for(int i = 0; i < n; i++){
printf("%s %d", stu[i].name, stu[i].score);
if(i < n - 1) printf("\n");
}
return 0;
}